Docker's core idea is simple — package an application with everything it needs to run, so it behaves identically on your laptop, your teammate's laptop, and production. The confusion usually starts with vocabulary: image, container, and layer get used almost interchangeably, but they're distinct things with distinct implications for how fast your builds run, how big your images end up, and how you debug something going wrong in production. This is a complete reference, not a quick overview — work through it in order, or jump straight to the section you need from the sidebar.