English version below
Docker Compose kann immer dann verwendet werden, wenn mehrere Docker-Container gleichzeitig gestartet und beendeet werden sollen und untereinander kommunizieren müssen. Ein klassischer Anwendungsfall ist eine Web-App mit Datenbankanbindung. Hier bräuchte man einen Container mit der App und einen Container mit der Datenbank. Außerdem muss die Datenbank einen Port anbieten, über den die App und die Datenbank kommunizieren können.
Docker Compose ist nicht automatisch in Docker integriert und muss zusätzlich installiert werden. Eine Anleitung dafür gibt es hier.
Docker-Compose file
Um Docker-Compose zu verwenden, muss man ein Docker-Compose-File anlegen. Dieses heißt in Regelfall „docker-compose.yml“ und ist im YAML-Format verfasst. Die Informationen aus dem docker-compose-file ersetzen oder ergänzen Informationen aus einem Dockerfile.
Grundlegende Struktur
Prinzipiell folgt das docker-compose-file folgender Struktur:
version: number-of-docker-version services: service-1: property-1: property-2: - list-if-needed service-2: property-1: property-2:
Die Datei enthält im Prinzip eine Auflistung aller gewünschten Dockercontainer und der Einstellungen, die für diese vorgenommen werden sollen.
Im folgenden werden einige mögliche Einstellungen näher erklärt.
container_name
Mit container_name
wird angegeben, wie der zu erstellende Container Docker-intern heißen soll. Wird diese Eigenschaft nicht angegeben, wird ein automatischer Name vergeben.
version: 3 services: my-container: container_name: my-container
image
Durch image
kann der Name eines DockerHub-images angegeben werden. Dieses wird dann als Basis für den Container genutzt.
Dockerfile-Äquivalent: FROM
version: 3 services: my-neo4j-service: image: neo4j
build
Mit build kann ein eigenes Dockerfile angegeben werden, das für das Erstellen des Containers verwendet werden soll. Dieses Argument hat zwei Unterpunkte: Mit context wird der Pfad zu dem Ordner angegeben, in dem das Dockerfile liegt, mit dockerfile dessen Name.
version: 3 services: my-container: build: context: . dockerfile: Dockerfile
volumes
volumes
gibt Festplatten an, die im Dockercontainer erstellt werden sollen. Wie auch im Dockerfile gibt es hier die Möglichkeit, die Festplatten mit Ordnern auf dem Host-System zu synchronisieren.
Dockerfile Äquivalent: VOLUME
version: 3 services: my-container: container_name: my-container volumes: - '.:/app' - '/app/node_modules'
ports
Wenn Ports spezifiziert werden sollen, die an das Host-System weitergeleitet werden, geht das über ports
. Hier werden die Ports wie im Dockerfile angegeben.
Dockerfile Äquivalent: PORTS
version: 3 services: my-container: ports: - "3000:3000" my-neo4j-container: image: neo4j ports: - "1234:4000"
English version
Docker Compose can be used whenever multiple Docker containers need to be started and stopped simultaneously and need to communicate with each other. A classic use case is a web app with database connection. Here, you would need a container with the app and a container with the database. Also, the database needs to provide a port through which the app and the database can communicate.
Docker Compose is not automatically integrated with Docker and needs to be installed additionally. Instructions are available here.
Docker Compose file
To use Docker-Compose, you have to create a Docker-Compose file. This is usually called „docker-compose.yml“ and is written in YAML format. The information from the docker-compose file replaces or supplements information from a Dockerfile.
Basic structure
In principle, the docker-compose-file follows the following structure:
version: number-of-docker-version services: service-1: property-1: property-2: - list-if-needed service-2: property-1: property-2:
Essentially, the file contains a listing of all the Docker containers you want to use and the settings to be made for them.
Some possible settings are explained in more detail below.
container_name
The container_name
is used to specify what the container that will be created should be called internally in Docker. If this property is not specified, an automatic name is assigned.
version: 3 services: my-container: container_name: my-container
image
With image
the name of a DockerHub image can be specified. This will then be used as the base for the container.
Dockerfile equivalent: FROM
version: 3 services: my-neo4j-service: image: neo4j
build
Use build
to specify a custom Dockerfile to use for building the container. This argument has two subparameters: Use context
to specify the path to the folder where the Dockerfile is located, and use dockerfile
to specify its name.
version: 3 services: my-container: build: context: . dockerfile: Dockerfile
volumes
volumes
specifies volumes to be created in the Docker container. As in Dockerfile, there is an option here to synchronize the disks with folders on the host system.
Dockerfile equivalent: VOLUME
version: 3 services: my-container: container_name: my-container volumes: - '.:/app' - '/app/node_modules'
ports
If ports that will be forwarded to the host system are to be specified, this is done via ports
. The ports are specified in the same way as in the Dockerfile.
Dockerfile equivalent: PORTS
version: 3 services: my-container: ports: - "3000:3000" my-neo4j-container: image: neo4j ports: - "1234:4000"