Docker Compose für Einsteiger: dein erster Stack, ohne Schmerzen
Docker Compose verständlich erklärt: was eine docker-compose.yml wirklich macht, wie du sie schreibst, und warum du nie wieder zehn 'docker run'-Befehle auswendig lernen musst.
Voraussetzungen
- Docker Engine installiert (docker --version läuft ohne Fehler)
- Docker Compose Plugin (docker compose version zeigt eine Versionsnummer)
- Ein Terminal und die Bereitschaft, mindestens einmal etwas kaputt zu machen
Ziel dieses Guides
Du verstehst, warum eine docker-compose.yml dir das Leben leichter macht als einzelne docker run-Befehle.
Du schreibst deine erste eigene Compose-Datei mit App, Datenbank und einem Volume, das einen Neustart übersteht.
Du kennst die drei Befehle, die du im Alltag wirklich brauchst – und die zwei, die dich retten, wenn nichts mehr geht.
Du weißt, wo Anfänger typischerweise stolpern, und wie du diese Stolperfallen von vornherein umgehst.
1Warum überhaupt Compose, reicht nicht auch docker run?
Kurze Antwort: theoretisch ja, praktisch nein. Sobald dein Setup aus mehr als einem Container besteht – sagen wir, eine App und eine Datenbank – wird jeder docker run-Befehl länger als eine SMS aus den 2000ern. Ports, Volumes, Netzwerke, Umgebungsvariablen, alles hübsch als Flags aneinandergereiht. Und beim nächsten Neustart musst du dich erinnern, wie genau du das damals eingetippt hast.
Genau dafür gibt es Docker Compose: eine einzige Datei, die beschreibt, was gestartet werden soll, wie die Container miteinander reden dürfen und was passieren soll, wenn der Server neu bootet. Du schreibst es einmal auf, und danach reicht ein einziger Befehl. Kein Gedächtnistraining mehr nötig.
2Das Grundgerüst einer docker-compose.yml
Eine Compose-Datei besteht im Kern aus Services. Jeder Service ist im Prinzip ein Container mit seinen eigenen Regeln: welches Image, welche Ports, welche Umgebungsvariablen, welche Volumes. Sieht auf den ersten Blick nach viel aus, ist aber im Grunde nur strukturiertes Aufschreiben von Dingen, die du sowieso schon als Flags eintippen würdest.
Leg dir einen Projektordner an und darin eine Datei namens docker-compose.yml. Der Name ist wichtig, Docker sucht standardmäßig genau danach.
Projektordner anlegen
Bash
mkdir mein-erster-stack
cd mein-erster-stack
touch docker-compose.yml3Der erste Service: eine kleine Webseite
Fangen wir klein an: ein Nginx-Container, der eine Startseite ausliefert. Kopiere den folgenden Inhalt in deine docker-compose.yml. Achte auf die Einrückung – YAML ist da eigenwillig und mag Tabs überhaupt nicht, nur Leerzeichen.
docker-compose.yml – einfacher Webserver
YAML
services:
webseite:
image: nginx:alpine
ports:
- "8080:80"
restart: unless-stopped
Stack starten
Bash
docker compose up -d4Datenbank dazu und die Container miteinander reden lassen
Jetzt wird es interessant. Wir hängen eine Postgres-Datenbank dran. Das Schöne an Compose: alle Services im selben File landen automatisch im selben Netzwerk und können sich gegenseitig über ihren Servicenamen erreichen. Deine App muss also nicht die IP-Adresse der Datenbank kennen, sie ruft einfach db an, und Docker kümmert sich um den Rest.
Passwörter direkt in die Compose-Datei zu schreiben ist okay zum Ausprobieren, für alles danach nutzt du besser eine separate .env-Datei. Nur damit das gesagt ist, bevor jemand sein Datenbank-Passwort versehentlich auf GitHub pusht.
docker-compose.yml – Webseite plus Datenbank
YAML
services:
webseite:
image: nginx:alpine
ports:
- "8080:80"
restart: unless-stopped
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: bitte-nicht-hunter2
volumes:
- db-daten:/var/lib/postgresql/data
restart: unless-stopped
volumes:
db-daten:
5Warum das Volume da unten so wichtig ist
Ohne das Volume db-daten würde deine Datenbank bei jedem docker compose down alle Daten verlieren, weil Container von Haus aus zustandslos sind – alles, was innendrin passiert, ist futsch, sobald der Container weg ist. Das Volume lagert die eigentlichen Daten außerhalb des Containers auf dem Host, sodass sie einen Neustart, ein Update oder ein versehentliches down überstehen.
Merksatz, der sich in jedem Homelab bewährt hat: Container sind Wegwerfware, Daten sind es nicht. Wenn du das einmal verinnerlicht hast, ersparst du dir eine Menge böser Überraschungen.
6Die Befehle, die du wirklich im Alltag brauchst
Es gibt eine ganze Liste an Compose-Befehlen, aber im Alltag reichen dir realistisch fünf davon. Die anderen kannst du dir bei Bedarf nachschlagen, das muss niemand auswendig können.
| Befehl | Was er macht |
|---|---|
| docker compose up -d | Startet alle Services im Hintergrund |
| docker compose down | Stoppt und entfernt die Container (Volumes bleiben) |
| docker compose logs -f webseite | Zeigt live die Logs eines einzelnen Service |
| docker compose ps | Zeigt, was gerade läuft und in welchem Zustand |
| docker compose restart db | Startet nur einen einzelnen Service neu |
Status und Logs prüfen
Bash
docker compose ps
docker compose logs -f webseite7Typische Anfängerfehler, die dir jetzt nicht mehr passieren
Erstens, Einrückung mit Tabs statt Leerzeichen. YAML quittiert das mit kryptischen Fehlermeldungen, die selten sagen, was wirklich falsch ist. Ein Editor mit YAML-Unterstützung erspart dir hier viel Frust.
Zweitens, Ports doppelt vergeben. Wenn 8080 schon von einem anderen Dienst belegt ist, startet dein Service einfach nicht, und die Fehlermeldung ist auch hier eher unterirdisch formuliert.
Drittens, docker compose down -v aus Versehen. Das kleine -v am Ende löscht auch die Volumes, also deine Daten. Zum Aufräumen während des Testens praktisch, im produktiven Setup ein guter Weg, sich selbst den Tag zu ruinieren.
FAQ
Nein. Du kannst fertige Images aus der Docker Hub direkt referenzieren, so wie in diesem Tutorial mit nginx:alpine und postgres:16-alpine. Ein eigenes Dockerfile brauchst du erst, wenn du eigenen Code in ein Image packen willst.