# Intro to Docker Concepts
There are a few main concepts that are critical to understanding how Docker works.
The main idea that everyone talks about is a **container**, which is an isolated environment for a process (or group of processes) to run in, without said process having access to processes outside the environment.
Behind the scenes, these containers are a set of Linux namespaces and cgroups restricting or limiting access on a per-process basis. Docker handles all of the creation and management of these tools, and just gives the user the abstraction of a "container." As the developer, you put your code and everything it needs to run inside of the container, and you don't need to worry about whatever happens outside of the container. This can be super helpful when it comes to things like versioning and dependencies.
Docker containers are made from **images**. You can think of an image as being like a blueprint - it's a depiction of how a container is built and what it needs in order to run.
Every image is made up of **layers**. A layer is a specific instruction for a container - this can be something like running a command, or copying files into an image. A Dockerfile is the most common way to build an image, and each layer in an image maps to a line in the Dockerfile.[^1]
[^1]: This isn't completely accurate - only specific lines in a Dockerfile create a new layer - but it's close enough for an introduction.