Ü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?

  • web ist unser Service-Name.
  • nginx:alpine ist das verwendete Image.
  • 127.0.0.1:8080:80 verbindet Port 8080 des Hosts mit Port 80 im Container.
  • Der Ordner ./html wird schreibgeschützt nach /usr/share/nginx/html eingebunden.
  • restart: unless-stopped startet 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.