root@level:~$
ServerEinsteiger16 min LesezeitAktualisiert 27.9.2026

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. , 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 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.yml

3Der 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 -d

4Datenbank 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 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.

BefehlWas er macht
docker compose up -dStartet alle Services im Hintergrund
docker compose downStoppt und entfernt die Container (Volumes bleiben)
docker compose logs -f webseiteZeigt live die Logs eines einzelnen Service
docker compose psZeigt, was gerade läuft und in welchem Zustand
docker compose restart dbStartet nur einen einzelnen Service neu

Status und Logs prüfen

Bash

docker compose ps
docker compose logs -f webseite

7Typische 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.

NÄCHSTES TUTORIAL
Energieverbrauch und Kühlung: warum Leistung Kontrolle braucht