3.1 Datei compose.yaml
Die Datei compose.yaml
(oder auch eine der folgenden Varianten: docker-compose.yaml
, docker-compose.yml
, compose.yml
) ist die Hauptkonfigurationsdatei, die von Docker Compose verwendet wird, um Multi-Container-Anwendungen zu definieren und zu verwalten. Sie beschreibt, welche Container (Services) gestartet werden sollen, wie sie miteinander interagieren und welche Ressourcen sie benötigen.
Der Einfachheit halber werden wir in dieser Vorlesung die Variante compose.yaml
verwenden, da diese für moderne Versionen von Docker Compose empfohlen wird.
Struktur der Datei compose.yaml
Die Datei compose.yaml
besteht aus mehreren Abschnitten, von denen jeder verschiedene Aspekte der Anwendungs-Konfiguration beschreibt. Die Hauptabschnitte umfassen:
- version: gibt die Version der Compose-Datei an (zum Beispiel
'3.9'
). - services: beschreibt die Container (Services), deren Einstellungen und Abhängigkeiten.
- volumes: definiert Volumes zur Daten-Speicherung zwischen Containern und Host.
- networks: konfiguriert Netzwerke, über die die Services miteinander kommunizieren.
3.2 Wichtige Direktiven
1. version
Die Direktive version definiert die Syntaxversion von Docker Compose, die in der Datei compose.yaml
verwendet wird. Zum Zeitpunkt des Schreibens dieses Artikels ist Version 3 mit Updates wie 3.8 und 3.9 die aktuellste.
version: '3.9'
2. services
Der Abschnitt services definiert die Container, die Compose erstellen und starten soll. Jeder Service stellt einen separaten Container mit einer bestimmten Konfiguration dar.
Beispiel:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
In diesem Beispiel sind zwei Services definiert: web
und db
. Der Service web
verwendet das Image nginx:latest
und öffnet Port 80. Der Service db
verwendet das Image mongo:latest
und bindet ein Volume zum Speichern von Daten.
3. volumes
Der Abschnitt volumes wird verwendet, um Volumes zu definieren, die an Container angehängt werden können, um Daten zu speichern. Das ist nützlich, um Daten beim Neustart von Containern beizubehalten.
Beispiel:
volumes:
mongo-data:
4. networks
Der Abschnitt networks ermöglicht es, benutzerdefinierte Netzwerke zu definieren, in denen Container betrieben werden. Das sorgt für Isolation und ermöglicht die Konfiguration von Netzwerkverbindungen. Wenn keine Netzwerke angegeben sind, erstellt Docker Compose ein Standardnetzwerk, und alle Services werden daran angeschlossen.
Beispiel:
networks:
front-end:
back-end:
3.3 Direktiven zur Konfiguration von Services
Die wichtigsten Direktiven für die Konfiguration von Services:
1. image
Die Direktive image gibt das Image an, das für die Erstellung eines Containers verwendet wird.
Beispiel:
services:
web:
image: nginx:latest
2. build
Die Direktive build wird verwendet, um den Pfad zur Dockerfile anzugeben, die für das Erstellen des Images genutzt werden soll.
Beispiel:
services:
app:
build: ./app
3. ports
Die Direktive ports definiert die Ports, die geöffnet und von der Host-Maschine auf den Container weitergeleitet werden sollen.
Beispiel:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
Die Direktive volumes mountet Volumes in Container, wodurch Daten zwischen Neustarts der Container gespeichert werden können.
Beispiel:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
Die Direktive environment legt Umgebungsvariablen für den Container fest.
Beispiel:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
Die Direktive depends_on gibt an, dass dieser Service von anderen Services abhängt und nach diesen gestartet werden soll.
Wichtig!
Beim Starten deines Services hast du keine 100%ige Garantie, dass alle für seinen Betrieb notwendigen Services vollständig bereit sind. Sie werden gestartet — ja, aber die weitere Funktionsfähigkeit ist nicht garantiert. Dieses Problem wird mit einem Health-Check gelöst, aber dazu später mehr.
Beispiel:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
Die Direktive command ermöglicht das Überschreiben des Befehls, der beim Starten des Containers ausgeführt wird.
Beispiel:
services:
app:
image: myapp:latest
command: python app.py
8. networks
Die Direktive networks verbindet einen Service mit einem oder mehreren Netzwerken.
Beispiel:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Vollständiges Beispiel
Beispiel einer vollständigen Datei compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
In diesem Beispiel:
- Es sind drei Services definiert:
web
,app
unddb
. -
web
verwendet das Nginx-Image, bindet eine Konfigurationsdatei ein und hängt vom Serviceapp
ab. -
app
wird über ein lokales Dockerfile erstellt, bindet den Quellcode der Anwendung ein und nutzt Umgebungsvariablen. -
db
verwendet das MongoDB-Image und bindet ein Volume für die Datenspeicherung ein. - Es werden zwei Volumes und zwei Netzwerke zur Isolierung und Steuerung der Interaktion zwischen den Services erstellt.
Hinweis: Ein Volume ist mongo-data
, und das andere ist ein gemountetes Verzeichnis von der Host-Maschine (z. B. ./app
).
GO TO FULL VERSION