| Typ | Konzept |
|---|---|
| Quellen | Quelle - Docker Bootcamp Quelle - Recherche - Docker heute 2026 |
| Erstellt | 2026-09-27 |
| Aktualisiert | 2026-09-27 |
| Tags | docker, container, devops, yaml |
Docker Compose startet eine Anwendung aus mehreren Containern mit einem einzigen Befehl. Die Services, ihre Images, Ports, Volumes, Umgebungsvariablen und Abhängigkeiten stehen in einer YAML-Datei compose.yaml; docker compose up legt dazu automatisch ein gemeinsames Netzwerk an.
Wozu
Eine Anwendung aus mehreren Containern (etwa Datenbank, Webserver und Verwaltungsoberfläche) von Hand aufzusetzen heisst: für jeden Container ein eigenes docker run, Netzwerk anlegen, Namen und Umgebungsvariablen abstimmen. Ein Dockerfile beschreibt nur ein einzelnes Image, keinen Verbund. Compose beschreibt den ganzen Verbund in einer Datei (Quelle - Docker Bootcamp, Folien 204–205).
YAML
YAML („YAML Ain't Markup Language“) stellt Daten gut lesbar dar, ähnlich wie JSON. Jedes JSON-Dokument ist gültiges YAML. Einrückungen legen die Struktur fest. Gebraucht werden vor allem Maps (Schlüssel: Wert) und Listen (- Eintrag) mit Zahlen, Booleans und Strings. Endung .yml oder .yaml (Folien 207–208).
Aufbau der compose.yaml
Der empfohlene Dateiname ist compose.yaml, verbreitet ist auch docker-compose.yml (Folie 210). Unter services: steht jeder Service mit seinen Einstellungen (Folien 211–212):
| Schlüssel | Bedeutung |
|---|---|
image |
Image, aus dem der Container entsteht |
build |
stattdessen ein Image aus einem Dockerfile bauen |
ports |
"Host:Container", wie -p |
volumes |
Volumes oder Bind Mounts, wie -v |
environment |
Umgebungsvariablen |
command |
Befehl im Container |
restart |
no, always, on-failure, unless-stopped |
depends_on |
Startreihenfolge |
container_name, expose, secrets |
Name, interne Ports, vertrauliche Daten |
- Volumes stehen zweimal: beim Service (
- mein-vol:/pfad) und nochmals auf oberster Ebene untervolumes:(Folie 218). - Geheimnisse und Einstellungen gehören in eine versteckte Datei
.env(variable=wert), in der Compose-Datei steht dann"$variable"(Folie 219). - Ein Service kann mehrere Container derselben Art starten, etwa drei nginx.
Befehle
docker compose up # Images holen, Netzwerk und Container anlegen, starten (-d für Hintergrund)
docker compose down # Container und Netzwerk entfernen, Volumes bleiben
docker compose stop | start | pause | unpause
docker compose up --scale flask-app=2
- Compose sucht standardmässig
./compose.yamlbzw../docker-compose.yaml. Das automatisch angelegte Bridge-Netzwerk heisst nach dem Projektordner (Folie 213). - Skalieren: Bei mehreren Containern pro Service nur den Container-Port angeben, dann vergibt Docker freie Host-Ports selbst. Portbereiche zusammen mit
--scalemachen oft Probleme (Folien 215–216). - Wie beim Dockerfile gilt: eigener Projektordner mit nur den nötigen Dateien (Build-Kontext).
Beispiele im Kurs
- MariaDB mit phpMyAdmin: zuerst mit
docker runund eigenem Netzwerk, dann als Compose-Datei mit Volume und Umgebungsvariablen (Folien 142–147, 217). - Flask, Redis und nginx: Frontend (Flask, zählt Seitenaufrufe), Backend (Redis-Datenbank) und nginx als Proxy davor. Die Service-Namen in der Compose-Datei müssen genau den Hostnamen entsprechen, die in
nginx.confundapp.pystehen, weil sich die Container über diese Namen finden (Folien 221–223).
Beispiel aus diesem Vault
Die Webseite dieses Wikis lief ursprünglich als Compose-Projekt im Ordner deploy/ (heute ungenutzt, siehe Sicherheit des eigenen Vaults):
services:
sync: # holt jede Minute den Stand von main aus GitLab
image: alpine/git
restart: unless-stopped
environment:
GIT_URL: ${GIT_URL} # kommt aus .env, darin steht das Lese-Token
volumes:
- vault-repo:/repo
web: # liefert site/ aus
image: nginx:alpine
restart: unless-stopped
ports:
- "${WEB_PORT:-8090}:80"
volumes:
- vault-repo:/srv/vault:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- sync
volumes:
vault-repo:
(gekürzt aus deploy/docker-compose.yml, Schleifenbefehl und Passwortdatei weggelassen)
Darin stecken fast alle Bausteine des Kurses: zwei Services, ein benanntes Volume, das beide teilen (der eine schreibt, der andere liest nur, :ro), Bind Mounts für die Konfiguration, ein Port-Mapping mit Standardwert, eine Restart-Policy, depends_on und Geheimnisse in der .env, die nicht ins Repository gehört.
Die Folien nennen version: '3' als „aktuell“ (Folie 210). Heute ignoriert Compose V2 dieses Feld und warnt: „The attribute version is obsolete“. Man lässt es weg, wie in der Compose-Datei dieses Vaults. Der Befehl heisst docker compose (mit Leerzeichen, Plugin), das alte eigenständige docker-compose ist abgelöst (Quelle - Recherche - Docker heute 2026).
Verwandt
- Container – die einzelnen Bausteine
- Dockerfile – eigene Images für die Services
- Container-Orchestrierung – Swarm verteilt Compose-ähnliche Stacks auf mehrere Rechner
- Microservices – Anwendungen aus vielen kleinen Diensten
- Sicherheit des eigenen Vaults – die Docker-Variante dieses Vaults
