Docker Compose

Aus Zweites Gehirn, dem persönlichen Wiki
Docker Compose
TypKonzept
QuellenQuelle - Docker Bootcamp
Quelle - Recherche - Docker heute 2026
Erstellt2026-09-27
Aktualisiert2026-09-27
Tagsdocker, 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 unter volumes: (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.yaml bzw. ./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 --scale machen 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 run und 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.conf und app.py stehen, 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.

Veraltet seit der Quelle

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