Überarbeitet am 8. September 2026.
Docker und das Compose-Plugin sind installiert – und jetzt? Für den ersten Test könnte man einfach das bekannte hello-world-Image starten. Das funktioniert, ist aber ein ziemlich langweiliges Compose-Beispiel: Der Container gibt einen Text aus und beendet sich sofort wieder.
Deshalb machen wir ein etwas praktischeres „Hello World“: Wir starten mit Docker Compose einen kleinen Nginx-Webserver und geben ihm unsere eigene HTML-Datei. Danach können wir die Seite im Browser beziehungsweise mit curl aufrufen.
Falls Docker noch fehlt, findest du hier die aktuelle Anleitung: Docker und Docker Compose unter Debian und Ubuntu installieren. Wenn du zuerst verstehen möchtest, was die einzelnen Zeilen einer Compose-Datei bedeuten, passt dazu Docker Compose erklärt: Services, Volumes, Ports und Netzwerke.
1. Projektverzeichnis anlegen
mkdir -p ~/docker-compose-hello/html
cd ~/docker-compose-hello
Unser kleines Projekt besteht gleich aus zwei Dateien:
docker-compose-hello/
├── compose.yaml
└── html/
└── index.html
2. Eine kleine HTML-Seite erstellen
nano html/index.html
Als Inhalt reicht für den Test:
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<title>Docker Compose Test</title>
</head>
<body>
<h1>Hallo von Docker Compose!</h1>
<p>Mein erster kleiner Compose-Webserver läuft.</p>
</body>
</html>
3. compose.yaml erstellen
nano compose.yaml
Unsere komplette Compose-Datei ist erstaunlich kurz:
services:
web:
image: nginx:alpine
restart: unless-stopped
ports:
- "127.0.0.1:8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
Die frühere Zeile version: '3' brauchen wir nicht mehr. Das Top-Level-Feld version ist bei aktuellem Docker Compose nur noch aus Kompatibilitätsgründen vorhanden und wird als obsolet eingestuft.
Was passiert hier?
webist unser Service-Name.nginx:alpineist das verwendete Image.127.0.0.1:8080:80verbindet Port 8080 des Hosts mit Port 80 im Container.- Der Ordner
./htmlwird schreibgeschützt nach/usr/share/nginx/htmleingebunden. restart: unless-stoppedstartet den Dienst nach einem Serverneustart wieder, solange wir ihn nicht bewusst gestoppt haben.
Die Bindung an 127.0.0.1 habe ich bewusst gewählt. Auf einem Server im Internet ist unser Test-Webserver damit nicht plötzlich öffentlich auf Port 8080 erreichbar.
4. Compose-Datei vor dem Start prüfen
docker compose config
Dieser Befehl liest die Compose-Datei ein und zeigt die aufgelöste Konfiguration. Gerade bei YAML-Fehlern oder falscher Einrückung ist das ausgesprochen praktisch.
5. Webserver starten
docker compose up -d
Beim ersten Start lädt Docker das Nginx-Image herunter. Danach läuft der Container im Hintergrund.
Den Status prüfen wir mit:
docker compose ps
6. Hello-World-Seite aufrufen
Direkt auf dem Server:
curl http://127.0.0.1:8080
In der Ausgabe sollte unser HTML mit „Hallo von Docker Compose!“ erscheinen.
Auf einem lokalen Linux-Rechner kannst du natürlich auch einfach http://127.0.0.1:8080 im Browser öffnen. Läuft Docker auf einem entfernten Server, würde ich den Port für diesen Test nicht extra öffentlich freigeben.
7. Logs ansehen
docker compose logs -f --tail 50 web
Rufst du die Seite erneut auf, siehst du die HTTP-Anfrage direkt im Nginx-Log. Mit Strg+C beendest du nur die Loganzeige – der Container läuft weiter.
8. HTML-Datei verändern
Das Schöne an unserem Bind Mount: Ändere einfach html/index.html. Du musst dafür weder ein neues Image bauen noch den Container neu erstellen.
nano html/index.html
Danach Browser neu laden beziehungsweise curl erneut ausführen – die Änderung ist sofort sichtbar.
9. Container neu starten
docker compose restart web
Für Änderungen an der Compose-Datei verwende ich dagegen meist erneut:
docker compose up -d
Compose erkennt Änderungen und erstellt den betroffenen Container bei Bedarf neu.
10. Image aktualisieren
docker compose pull
docker compose up -d
Damit lädt Docker ein neueres Image und erstellt den Container anschließend daraus neu.
11. Projekt wieder stoppen
docker compose down
Damit werden die Container und das von Compose angelegte Netzwerk des Projekts entfernt. Unsere Dateien unter ~/docker-compose-hello bleiben natürlich erhalten.
Bei Projekten mit benannten Volumes solltest du nicht gedankenlos docker compose down -v verwenden. Das zusätzliche -v entfernt auch die zum Projekt gehörenden Volumes und kann damit persistente Daten löschen.
Und wie geht es weiter?
Mit diesem kleinen Projekt hast du schon die wichtigsten Compose-Handgriffe benutzt: config, up, ps, logs, restart, pull und down.
Als nächstes kannst du ein echtes Mehrcontainer-Projekt ausprobieren. Wie die einzelnen Bausteine funktionieren, erkläre ich ausführlicher in Docker Compose erklärt. Für den alltäglichen Umgang mit einzelnen Containern passt außerdem Docker-Container für Einsteiger.
Die aktuelle Referenz findest du direkt bei Docker Compose.
Gedanken dazu 0 Kommentare
Noch ist es ruhig hier. Dein Gedanke könnte der erste sein.
Was denkst du dazu?
Dein Kommentar erscheint nach der Freigabe.