Docker cheat sheet
Docker has been out there since 2013. During these past 10 years, it underwent rapid development phases and regular API changes (I remember it quite well from 2014). Even though it's one of the most popular technologies that software developers are using every day, and it runs a lot of software now, many people still can't get out 100% of it.
Because of that, I've decided to create a cheat sheet that you can use to improve your docker skills!
Images
Just a few words on what Docker images are: A Docker image is the set of processes outlined in the Dockerfile. It is helpful to think of these as templates created by the Dockerfiles. They are arranged in layers on top of each other. When you run a container, you're interacting with the top (latest) layer only.
List images
docker images
List all images
docker images -a
Import docker image from tarball
docker import
Build a docker image
docker build
Tag a docker image
docker tag {image_id} repo:tag
Build a docker image with a tag
docker build -t repo:tag
Create an image from a container
docker commit
Remove a single image
docker rmi {image_id}
Load docker image from stdin, including tags
docker import
See an image history
docker history {image_id}
Load a docker image from a file
docker load < archive.tar.gz
Push an image to the registry
docker push repo:tag
Pull an image from the registry
docker pull repo:tag
Remove dangling images
docker image prune
Remove all images that are not used by any container
docker image prune -a
Find an image in the official repository
docker search text
Containers
To simplify, we can say that when a Docker image is instantiated, it becomes a container. By creating an instance that draws on system resources like memory, the container begins to carry out whatever processes are together within the container.
Create a docker container (without starting it)
docker create
Rename a docker container
docker rename
Create and start a docker container
docker run
Create and start a container with a custom name and detach it
docker start --name your-name -d repo:tag
Delete a docker container
docker rm {container_name}
Update the container's limit
docker update
Remove the container once it stops
docker run --rm
Remove the container together with the volumes associated with it
docker rm -v
Start the container
docker start {container_name}
Stop the container
docker stop {container_name}
Restart the container
docker restart {container_name}
Send SIGKILL to the container
docker kill {container_name}
Attach to running container
docker attach {container_name}
List the running containers
docker ps
List all the containers, including stopped
docker ps -a
See docker stats. Provide the container name to show stats for that one only.
docker stats
// docker stats {container_name}
See container logs; add -f to follow logs.
docker logs {container_name}
// docker logs -f {container_name}
Inspect details of container - IP address, volumes attached, ENV variables
docker inspect {container_name}
Check what ports the container listens on
docker port {container_name}
Display running processes in the container
docker top {container-name}
Copy files between a container and a host
docker cp
Execute a command in a container
docker exec
Networks
Docker allows you to create a network that makes connecting to and between containers easier. There are three types of networks in docker - bridge, host, and none. By default, the new container is launched in bridge mode. To establish communication between containers, you should create a network for that.
Create a docker network.
docker network create {name}
List all docker networks.
docker network ls
Remove a docker network with a given name.
docker network rm {name}
Get details about the network (subnet, gateway, scope, type, etc.)
docker network inspect {name}
Connect a container to the network
docker network connect {network} {container}
Disconnect a container from the network
docker network disconnect {network} {container}
Docker compose
For years, if you wanted to run a bunch of docker containers grouped for a project, talk to each other, be dependent on each other, and have the ability to control the entire stack in a simple way, there was a docker-compose project (compose v1), which was a built-in python. Now we have compose v2, rewritten it to Go, and been part of Docker Desktop and as a plugin for Linux. The main difference is a compose
subcommand of docker
instead of being another binary. v2 is backward compatible, so if you're already familiar with docker-compose
you'll be fine.
Run a multi-container application
docker compose up
- you can specify a config file with -f
argument and run it in the background with -d
argument
docker compose -f my-compose.yml up -d
- will use my-compose.yml
file as a definition and set up in the background.
List all running containers.
docker compose ps
Stop an entire set of containers
docker compose stop
Start an entire set of containers again
docker compose start
Restart an entire set of containers
docker compose restart
Stop and remove an entire set of containers
docker compose down
Build containers
docker compose build
- you can use Dockerfile instead of the existing image.
Sample docker-compose file for Rails project:
services:
db:
image: postgres
volumes:
- ./tmp/db:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: password
web:
build: .
command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
volumes:
- .:/myapp
ports:
- "3000:3000"
depends_on:
- db
The example above will create a multi-container application consisting of two services:
- db service that will use the latest postgres image and mount ./tmp/db
directory as /var/lib/postgresql/data
in the container.
- web service that will use Dockerfile in the current working directory to build a docker image for the Ruby on Rails application. It will expose port 3000 to use on the host system and depends on db service, so db service will be created and run first.
Source of well-defined docker-compose examples: https://github.com/docker/awesome-compose (it's an official repository maintained by docker) - there are examples for popular services like WordPress, ELK stack, or Wireguard server.