Docker's pitch is simple: package an application with all of its dependencies into a single, isolated unit, and it runs the same way everywhere. No more "it works on my machine."
If you have never run a container before, this guide gets you from zero to a running container in about ten minutes — and explains what is actually happening at each step.
Images vs. containers
Two terms you need straight away:
- An image is a read-only blueprint. Think of it like a class definition.
- A container is a running instance of that image. Think of it like an object instantiated from the class.
You pull an image once, then run as many containers from it as you like.
Prerequisites
Install Docker Engine for your platform (Docker Desktop on macOS and Windows, Docker Engine on Linux), then verify it works:
docker --version If a version number prints, you are ready.
Step 1: Pull a base image
Images live in registries, usually Docker Hub. Let's start with Alpine Linux — it is small and fast to pull:
docker pull alpine Docker downloads the image layers and stores them locally. You will see progress output for each layer.
Step 2: Run your first container
docker run alpine echo "Hello from a container" That single command did a lot:
- Docker found the
alpineimage locally. - It created a writable container layer on top of the image.
- It executed
echo "Hello from a container"inside the container. - The process exited, and the container stopped.
Because the command finished immediately, the container is now in an exited state. Run docker ps -a to see it:
docker ps -a docker ps with no flags shows only running containers. Add -a to include stopped ones.
Step 3: Get a shell inside a container
The useful case is an interactive shell:
docker run -it alpine sh -
-ikeeps stdin open. -
-tallocates a pseudo-TTY. -
shis the command to run inside the container (Alpine has no bash by default).
You are now root inside the container. Try:
cat /etc/os-release ls / exit Typing exit stops the container.
Step 4: Run something that stays alive
Containers stop when their main process stops. To keep one running, give it a long-running process:
docker run -d --name web -p 8080:80 nginx -
-druns it detached (in the background). -
--name webgives the container a name you can reference. -
-p 8080:80maps port 8080 on your machine to port 80 in the container.
Open http://localhost:8080 and you should see the nginx welcome page.
Step 5: Manage your containers
docker ps # running containers docker stop web # stop by name docker start web # start it again docker logs web # view output docker exec -it web sh # open a shell in a running container docker rm web # delete a stopped container Step 6: Clean up
docker images # list downloaded images docker rmi alpine # remove an image docker system prune # remove stopped containers, unused images, and caches Be careful with docker system prune — it deletes anything not currently in use.
Where to go next
-
docker buildand Dockerfiles — turning your own application into an image - Docker Compose — running multi-container setups from a single file
- Volumes — persisting data outside the container lifecycle
This guide is adapted from the Docker walkthrough on hSECURITIES, which covers Dockerfile basics and common mistakes beginners make.

