Was ist docker compose und wie funktioniert es?
Autor: Redaktion Domeny.ForSale Veröffentlicht
Kurz erklärt: Docker Compose ist ein Werkzeug zum Definieren und Starten von Anwendungen, die aus mehreren Docker-Containern bestehen. In einer einzigen Datei beschreibst du die Dienste, ihre Konfiguration, ihre Verbindungen und die Datenspeicherung. Anschließend startest du sie mit dem Befehl docker compose up. Das ist beispielsweise hilfreich, wenn ein Projekt eine Anwendung, eine Datenbank und eine zusätzliche Verwaltungsoberfläche benötigt.
Wie Docker Compose mit Docker zusammenarbeitet
Docker führt Programme in Containern aus. Das sind isolierte Umgebungen, die die Anwendung und ihre benötigten Abhängigkeiten enthalten. Ein Container entsteht aus einem Image – einem fertigen Paket, das festlegt, was ausgeführt werden soll. Compose ersetzt Docker nicht, sondern nutzt es, um eine Gruppe zusammengehöriger Container zu verwalten.
Ohne Compose kannst du jeden Container mit einem eigenen docker run-Befehl starten und dabei Ports, Umgebungsvariablen und das Netzwerk manuell angeben. Mit Compose lassen sich diese Einstellungen in der Datei compose.yaml speichern. So kannst du die Konfiguration zusammen mit dem Projektcode aufbewahren und auf einem anderen Computer wiederherstellen.
Ein grundlegender Begriff ist der Dienst: die Definition eines bestimmten Bestandteils der Umgebung, beispielsweise einer Datenbank. Compose erstellt die Container anhand dieser Definitionen. Standardmäßig legt es auch ein Projektnetzwerk an, in dem sich die Dienste über ihre Namen gegenseitig erreichen können.
Was in der Datei compose.yaml steht
Die Konfiguration wird in YAML gespeichert, einem Textformat, dessen Struktur durch Einrückungen bestimmt wird. Die Einrückungen müssen einheitlich sein; verwende dafür Leerzeichen statt Tabulatoren.
Am häufigsten begegnen dir folgende Elemente:
services– die Liste der Dienste, aus denen die Umgebung besteht.image– das Image, aus dem der Container gestartet wird; alternativ legtbuildfest, wie ein eigenes Image gebaut wird.ports– die Zuordnung eines Ports des Computers zu einem Port des Containers. Dadurch wird der Dienst von außerhalb des Containernetzwerks erreichbar.environment– Umgebungsvariablen zur Konfiguration des Programms.volumes– das Einbinden von Verzeichnissen oder Volumes, also Speicherorten, die Daten unabhängig vom Lebenszyklus des Containers aufbewahren.
Dass die Container gestartet sind, bedeutet noch nicht, dass die Anwendung korrekt funktioniert. Die Datenbank braucht möglicherweise Zeit zur Initialisierung, und die Anwendung sollte einen Verbindungsversuch wiederholen können. depends_on kann die Startreihenfolge festlegen, garantiert in seiner Grundform aber nicht, dass ein Dienst bereit ist. Dafür müssen die Zustandsprüfung, also healthcheck, und die Abhängigkeitsbedingung passend konfiguriert sein.
Beispiel: PostgreSQL und eine Datenbankoberfläche
Angenommen, du möchtest PostgreSQL lokal testen, ohne die Datenbank direkt auf deinem System zu installieren. Dazu benötigst du die Verwaltungsoberfläche Adminer, mit der du die Daten im Browser ansehen kannst. Erstelle ein Projektverzeichnis und speichere darin die Datei compose.yaml:
services:
db:
image: postgres:17
environment:
POSTGRES_USER: demo
POSTGRES_PASSWORD: lokales_demo_passwort
POSTGRES_DB: demo
volumes:
- db_data:/var/lib/postgresql/data
adminer:
image: adminer:5
ports:
- "127.0.0.1:8080:8080"
volumes:
db_data:
Starte die Umgebung in diesem Verzeichnis:
docker compose up -d
Die Option -d startet die Container im Hintergrund. Beim ersten Start lädt Docker die Images herunter, sofern sie nicht bereits lokal vorhanden sind.
Öffne im Browser die Adresse http://localhost:8080. Wähle in der Oberfläche PostgreSQL aus und gib als Server db, als Benutzer demo, als Passwort lokales_demo_passwort und als Datenbank demo an. Falls die Datenbank noch initialisiert wird, warte kurz und versuche erneut, dich anzumelden.
Der Name db funktioniert innerhalb des Compose-Netzwerks. Verwende dort nicht localhost: Aus Sicht des Adminer-Containers würde dieser Name den Adminer-Container selbst bezeichnen, nicht die Datenbank. In diesem Beispiel wird kein PostgreSQL-Port auf dem Computer freigegeben. Die Verwaltungsoberfläche ist dagegen ausschließlich über die lokale Schnittstelle des Computers erreichbar.
Diese Konfiguration ist zum Lernen gedacht und keine fertige Produktionsumgebung. Verwende das Beispielpasswort nicht für echte Daten und speichere keine echten Zugangsdaten oder sonstigen Geheimnisse im Repository.
Befehle für die tägliche Arbeit
Der aktuelle Befehl lautet docker compose, mit einem Leerzeichen. Die Schreibweise docker-compose, die in älteren Anleitungen vorkommt, gehört zu einer älteren Installationsvariante des Werkzeugs. Mit docker compose version prüfst du, ob Compose verfügbar ist. Falls der Befehl nicht funktioniert, prüfe in der offiziellen Docker-Dokumentation die Installationsanleitung für dein System.
| Befehl | Verwendung |
|---|---|
docker compose ps | Zeigt die Container des Projekts und ihren Status an. |
docker compose logs -f | Zeigt die Logs an und verfolgt neue Meldungen laufend mit. |
docker compose stop | Stoppt die Container, ohne sie zu entfernen. |
docker compose down | Entfernt die Container und das Projektnetzwerk, behält benannte Volumes aber standardmäßig bei. |
docker compose config | Prüft die Konfiguration und zeigt die daraus resultierende Konfiguration an. |
Vorsicht bei docker compose down -v: Die Option -v entfernt auch die vom Projekt verwalteten Volumes und löscht in diesem Beispiel somit die Daten der Datenbank. Ein Volume erhält die Daten, wenn der Container entfernt wird, ersetzt aber kein Backup.
Wann Compose ausreicht – und wann nicht
Compose eignet sich gut für die lokale Anwendungsentwicklung, Integrationstests und einfache Bereitstellungen auf einem einzelnen Server. Besonders nützlich ist es, wenn mehrere Personen dieselbe Gruppe von Diensten starten sollen, ohne die Einstellungen manuell nachzubilden.
Von sich aus bietet Compose weder die Verwaltung eines Clusters aus mehreren Servern noch Hochverfügbarkeit. Für einen Produktivbetrieb musst du Sicherheitsmaßnahmen, Backups, Monitoring und Image-Aktualisierungen gesondert planen. Ein Image-Tag wie postgres:17 kann auf aufeinanderfolgende Versionen derselben Versionsreihe verweisen. Wenn du exakt reproduzierbare Ergebnisse benötigst, solltest du erwägen, das Image auf einen bestimmten Digest festzulegen, also auf die Kennung seines Inhalts.
Starte zunächst das Beispiel, prüfe die Logs und führe docker compose down aus. Führe danach erneut docker compose up -d aus. So kannst du den Unterschied zwischen einem neu erstellten Container und den erhaltenen Daten praktisch nachvollziehen.
Siehe auch: Was ist ein ETF?
