Docker and Docker Compose Commands
In this lesson, we'll take a look at Docker Compose!
We'll cover the following
Docker Compose is used for the coordination of multiple Docker containers. Microservices systems usually consist of many Docker containers. Therefore, it makes sense to start and stop the containers with Docker Compose.
Docker Compose #
Docker Compose uses the file docker-compose.yml
to store information
about the containers. The
Docker documentation
explains the structure of this file.
Upon starting, docker-compose
outputs all possible commands. The
most important commands for Docker Compose are:
-
docker-compose build
generates the Docker images for the containers with the help of theDockerfiles
referenced indocker-compose.yml
. -
docker-compose pull
downloads the Docker images referenced indocker-compose.yml
from Docker hub. -
docker-compose up -d
starts the Docker containers in the background. Without-d
the containers will start in the foreground so that the output of all Docker containers happens on the console. It is not particularly clear which output originates from which Docker container. The option--scale
can start multiple instances of a service, e.g.,docker-compose up -d --scale order=2
starts two instances of the order service. The default value is one instance. -
docker-compose down
stops and deletes the containers. In addition, the network and the Docker file systems, are deleted. -
docker-compose stop
stops the containers. Network, file systems and containers are not deleted.
Docker #
At startup docker
, outputs all valid commands without parameters.
Tip: Tab-pressing completes names and IDs of containers and images.
Here is an overview of the most important commands. The container
ms_catalog_1
is used as an example.
State of a container #
-
docker ps
displays all running Docker containers.docker ps -a
also shows stopped Docker containers. The containers, like the images, have a hexadecimal ID and a name.docker ps
outputs this information. For other commands, containers can be identified by name or hexadecimal ID. For the example in this book, the containers have names likems_catalog_1
. This name consists of a prefixms
for the project, the name of the servicecatalog
, and the sequence number1
. The name of the container is often confused with the name of the image (e.g.ms_catalog
). -
docker logs ms_catalog_1
shows the previous output of the containerms_catalog_1
.docker logs -f ms_catalog_1
also displays all other outputs that the container still outputs.
Lifecycle of a container #
-
docker run ms_catalog --name="container_name"
starts a new container with the imagems_catalog
that gets the namecontainer_name
. The parameter--name
is optional. The container then executes the command that is stored in theCMD
entry of theDockerfile
. You can execute a command in a container withdocker run <image> <command>
. docker runewolff/docker-java /bin/ls
executes the command/bin/ls
in a container with the Docker imageewolff/docker-java
. The command displays the files in the root directory of the container. If the image does not yet exist locally, it is automatically downloaded from the Docker hub on the Internet. When the command has been executed, the container shuts itself down. -
docker exec ms_catalog_1 /bin/ls
executes/bin/ls
in the running containerms_catalog_1
. Thus, with these commands you can start tools in an already running container.docker exec -it ms_catalog_1 /bin/sh
starts a shell and redirects input and output to the current terminal. This way, you have a shell in the Docker container and can interactively work with the container. -
docker stop ms_catalog_1
stops the container. It first sends a SIGTERM so that the container can shut down cleanly, and then a SIGKILL. -
docker kill ms_catalog_1
terminates execution of the container with a SIGKILL. But the container is still there. -
docker rm ms_catalog_1
permanently deletes the container. -
docker start ms_catalog_1
starts the container that was stopped. As the data is not deleted when the container was stopped, all data is still available. -
docker restart ms_catalog_1
restarts the container.
Docker images #
-
docker images
displays all Docker images. The images have a hexadecimal ID and a name. For other commands, images can be identified by both mechanisms. -
docker build -t=<name> build <path>
creates an image with the namename
. TheDockerfile
has to be stored in the directorypath
. When no version is indicated, the image gets the versionlatest
. As an alternative, the version can also be indicated in the format-t=<name:version>
. The Dockerfiles lesson describes the format of theDockerfiles
. -
docker history <image>
shows the layers of an image. For each layer, the ID, the executed command, and the size of the layer are displayed. The image to be displayed can be identified by its name if there is only one version of the image with that name. Otherwise, the name and version must be specified vianame:version
. Of course, it is also possible to use the hexadecimal ID of the image. -
docker rmi <image>
deletes an image. As long as a container is still using the image, it cannot be deleted. -
docker push
anddocker pull
store Docker images in a registry or load them from a registry. If no other registry is configured, the public Docker hub is used.
Cleaning up #
There are several commands to clean up the Docker environment.
-
docker container prune
deletes all stopped containers. -
docker image prune
deletes all images that do not have a name. -
docker network prune
deletes all unused Docker networks. -
docker volume prune
deletes all Docker volumes that are not used by a Docker container. -
docker system prune -a
deletes all stopped containers, all unused networks, and all images that are not used by at least one container. All that remains is what the currently running containers need.
Troubleshooting #
If an example does not work:
-
Are all containers running?
docker ps
displays the running containers,docker ps -a
shows the terminated ones. -
Logs can be displayed with
docker logs
. This works for terminated containers too. The termKilled
in the logs denotes that too little memory is available. Under Windows and macOS you can find the settings for this in the Docker application under Preferences/ Advanced. Docker should have about 4 GB assigned. -
In the case of more complex problems, you can start a shell in the container with
docker exec -it ms_catalog_1 /bin/sh
and examine the container more closely.
Get hands-on with 1400+ tech skills courses.