Docker Compose
Warum Compose
Abschnitt betitelt „Warum Compose“Ein docker run mit Port, drei Volumes und acht Umgebungsvariablen ist eine Zeile, die niemand mehr lesen will. Und eine richtige Anwendung besteht selten aus einem Container: Nextcloud braucht eine Datenbank, ein Blog braucht Webserver plus Datenbank plus Cache. Docker Compose beschreibt alle Container einer Anwendung in einer YAML-Datei und startet, stoppt und aktualisiert sie mit einem Befehl. Die Datei liegt im Projektordner und gehört in Git, damit sie dokumentiert und wiederholbar ist.
Compose ist seit Version 2 Teil von Docker (docker compose, ohne Bindestrich). Das Plugin hast du auf der vorherigen Seite mitinstalliert:
docker compose versionAufbau der compose.yaml
Abschnitt betitelt „Aufbau der compose.yaml“Ein kleiner Stack mit Webserver und Datenbank, um die Elemente zu zeigen:
services: web: image: nginx:1.27 ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html:ro depends_on: - db restart: unless-stopped
db: image: mariadb:11.4 environment: MARIADB_ROOT_PASSWORD: geheim volumes: - dbdaten:/var/lib/mysql restart: unless-stopped
volumes: dbdaten:| Schlüssel | Bedeutung |
|---|---|
services |
Ein Eintrag pro Container. Der Name (web, db) ist gleichzeitig der Hostname im internen Netz: web erreicht die Datenbank unter db. |
image |
Image und Tag, wie bei docker run. |
ports |
Port-Mapping Host:Container, in Anführungszeichen, weil YAML 8080:80 sonst als Zeitangabe lesen könnte. |
volumes |
Bind-Mounts (beginnen mit ./ oder /) oder Named Volumes, die unten unter volumes: deklariert werden. |
environment |
Umgebungsvariablen für die Konfiguration des Containers. Was ein Image versteht, steht in seiner Beschreibung auf Docker Hub. |
depends_on |
Startreihenfolge. web startet erst, wenn db gestartet ist. |
restart |
unless-stopped startet den Container nach einem Reboot automatisch neu, ausser du hast ihn selbst gestoppt. |
YAML ist einrückungsempfindlich: immer zwei Leerzeichen, nie Tabulatoren. docker compose config liest die Datei und zeigt sie aufgelöst an, das ist dein Syntax-Check.
Die wichtigsten Befehle
Abschnitt betitelt „Die wichtigsten Befehle“Alle Befehle laufen im Ordner mit der compose.yaml:
| Befehl | Zweck |
|---|---|
docker compose up -d |
Images laden, Netz und Volumes anlegen, alle Container starten |
docker compose ps |
Status des Stacks |
docker compose logs -f |
Logs aller Container mitlesen, logs -f db nur eines |
docker compose exec db bash |
Befehl in einem laufenden Container |
docker compose pull |
Neue Images laden, ohne etwas zu starten |
docker compose down |
Container und Netz entfernen. Volumes bleiben. |
docker compose down -v |
Dasselbe inklusive Volumes. Daten sind danach weg. |
Nextcloud mit MariaDB
Abschnitt betitelt „Nextcloud mit MariaDB“Nextcloud ist eine eigene Cloud für Dateien, Kalender und Kontakte. Das offizielle Image braucht eine Datenbank, also werden es zwei Container. Passwörter gehören nicht in die compose.yaml, sondern in eine Datei .env im selben Ordner. Compose liest sie automatisch und setzt ${VARIABLE} ein.
- Projektordner anlegen:
Terminal-Fenster mkdir -p ~/nextcloud && cd ~/nextcloud - Die
compose.yaml. Der Healthcheck sorgt dafür, dass Nextcloud erst startet, wenn MariaDB wirklich Verbindungen annimmt:compose.yaml services:db:image: mariadb:11.4restart: unless-stoppedcommand: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROWvolumes:- db:/var/lib/mysqlenvironment:MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}MARIADB_DATABASE: nextcloudMARIADB_USER: nextcloudMARIADB_PASSWORD: ${DB_PASSWORD}healthcheck:test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]interval: 10stimeout: 5sretries: 5app:image: nextcloud:stablerestart: unless-stoppedports:- "8080:80"depends_on:db:condition: service_healthyvolumes:- nextcloud:/var/www/htmlenvironment:MYSQL_HOST: dbMYSQL_DATABASE: nextcloudMYSQL_USER: nextcloudMYSQL_PASSWORD: ${DB_PASSWORD}NEXTCLOUD_ADMIN_USER: ${NC_ADMIN_USER}NEXTCLOUD_ADMIN_PASSWORD: ${NC_ADMIN_PASSWORD}NEXTCLOUD_TRUSTED_DOMAINS: ${NC_TRUSTED_DOMAINS}volumes:db:nextcloud: - Die
.envmit den Geheimnissen. Passwörter erzeugst du mitopenssl rand -hex 16, beiNC_TRUSTED_DOMAINSträgst du die IP deiner VM ein, sonst lehnt Nextcloud den Zugriff ab:.env DB_ROOT_PASSWORD=f2b1...DB_PASSWORD=9c4e...NC_ADMIN_USER=vornameNC_ADMIN_PASSWORD=7a0d...NC_TRUSTED_DOMAINS=10.0.0.42 - Prüfen, dass die Variablen eingesetzt werden, dann starten:
Der erste Start dauert ein bis zwei Minuten, weil Nextcloud die Datenbank einrichtet. Sobald im Log
Terminal-Fenster docker compose config | grep -i passworddocker compose up -ddocker compose psdocker compose logs -f appInitializing finishedsteht, öffnest duhttp://IP-DEINER-VM:8080und meldest dich mit dem Benutzer aus der.envan.
Ordnernextcloud/
- compose.yaml
- .env Passwörter, nicht in Git
- .env.example Vorlage mit Platzhaltern, in Git
- .gitignore
Updates
Abschnitt betitelt „Updates“Neue Versionen der Images kommen regelmässig. Der Ablauf ist immer derselbe:
docker compose pulldocker compose up -ddocker image pruneup -d ersetzt nur die Container, deren Image sich geändert hat. Die Daten liegen in den Volumes und bleiben erhalten. image prune räumt die alten Images weg. Bei Nextcloud gilt zusätzlich: Nur eine Hauptversion auf einmal, darum der Tag stable statt latest.
Backup der Volumes
Abschnitt betitelt „Backup der Volumes“Was in Modul 10 für Verzeichnisse galt, gilt hier für die Volumes: Ohne Backup ist der Stack nur so sicher wie die Disk der VM. Zwei Dinge sind zu sichern, die Datenbank und die Dateien.
# Datenbank als SQL-Dump, lesbar und unabhängig von der MariaDB-Versiondocker compose exec db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" nextcloud' > nextcloud-$(date +%F).sql
# Dateien: Stack anhalten, Volume mit einem Hilfscontainer packen, weiterlaufen lassendocker compose stopdocker run --rm -v nextcloud_nextcloud:/daten:ro -v "$PWD":/backup ubuntu tar czf /backup/nextcloud-dateien-$(date +%F).tgz -C /daten .docker compose startDer Name des Volumes setzt sich aus Projektordner und Volume-Namen zusammen, docker volume ls zeigt ihn dir. Die beiden Dateien kopierst du anschliessend mit rsync oder scp auf einen anderen Rechner, genau wie in Modul 10.
Lösung anzeigen
Die compose.yaml entspricht dem Listing oben, sie liegt auch unter scripts/linux/11-container-projekt/compose.yaml im Repository, zusammen mit einer .env.example.
cd ~/nextcloudscript ~/lernplattform/labs/linux/11-container-projekt/compose.txtdocker compose psdocker compose logs --tail 20 appdocker volume lsdocker compose exec db sh -c 'mariadb-dump -u root -p"$MARIADB_ROOT_PASSWORD" nextcloud' > nextcloud-dump.sqlls -lh nextcloud-dump.sql# down entfernt Container und Netz, die Volumes und damit alle Dateien bleiben.# down -v entfernt auch die Volumes, die Dateien und die Datenbank sind weg.exitcp compose.yaml .env.example ~/lernplattform/labs/linux/11-container-projekt/Selbstcheck · 5 Fragen
Weiterführend
Abschnitt betitelt „Weiterführend“- Docker Docs: Compose file reference
- Nextcloud auf Docker Hub, mit den Umgebungsvariablen
- MariaDB auf Docker Hub