Worum geht’s
Im HomeLab und in der Systemintegration laufen Dienste fast immer als Container.
Du baust und startest sie, verschaltest sie über Netzwerke und persistierst
Daten in Volumes. Wer den Unterschied zwischen Image und Container kennt und eine
docker-compose.yml lesen kann, deployt und debuggt Multi-Service-Stacks
zuverlässig.
Konzept
- Image vs. Container: ein Image ist die unveränderliche Vorlage (Code +
Abhängigkeiten, in Schichten gebaut). Ein Container ist eine laufende
Instanz dieses Images — flüchtig: ist er weg, sind nicht-persistierte Daten
weg. Persistenz schaffen Volumes (
-v daten:/var/lib/app). - Compose:
docker-compose.ymlbeschreibt mehrereservicesdeklarativ — Image, Ports,volumes,environment,depends_on.docker compose up -dstartet den ganzen Stack,downräumt ihn auf. Reproduzierbar und versionierbar. - Netzwerke: Compose legt ein gemeinsames Bridge-Netz an; Container
erreichen sich über den Servicenamen als DNS (z. B.
db:5432), nicht überlocalhost. Nur die perports:veröffentlichten Ports (8080:80) sind vom Host aus erreichbar — der Rest bleibt intern. - Ports: Schreibweise
host:container.8080:80mappt Host-Port 8080 auf Container-Port 80.
Faustregel beim Debuggen: docker ps (läuft er?), docker logs <name> (was sagt
er?), docker exec -it <name> sh (rein und nachsehen).
Beispiel-Fall
Gegeben: Eine Web-App im Container erreicht ihre Datenbank nicht — Log sagt
connection to localhost:5432 refused.
docker compose ps→ beide Container laufen,webunddb.- Log der App: sie verbindet auf
localhost:5432. Im Container istlocalhostaber der Container selbst — dort läuft keine DB. - In Compose teilen sich beide ein Netz;
dbist per Servicename erreichbar. Die Verbindung muss aufdb:5432zeigen, nichtlocalhost. DATABASE_HOST=dbinenvironment:setzen,docker compose up -dneu.docker logs web→ Verbindung steht.docker exec -it web ping dbbestätigt die Namensauflösung.
Lehre: In Compose redet man über Servicenamen, nicht localhost. Das ist der
mit Abstand häufigste Anfängerfehler bei Container-Netzwerken.
Anwenden
Lass dir einen Stack generieren und lies die erzeugte docker-compose.yml Zeile für Zeile — verstehe jedes Feld, bevor du es übernimmst.
- Wähle im Generator zwei Dienste, die zusammenarbeiten (z. B. eine App + eine Datenbank).
- Beachte, wie volumes für Persistenz und environment für Konfiguration gesetzt werden.
- Prüfe, über welchen Servicenamen die App die Datenbank erreichen würde — nicht localhost.
Selbsttest
Praxis-Challenge
Generiere einen Compose-Stack aus App + Datenbank. Setze bewusst den
DB-Hostnamen der App auf localhost und starte — beobachte den
Verbindungsfehler in docker logs. Ändere ihn auf den Servicenamen, starte neu
und belege per docker exec … ping <db>, dass die Namensauflösung jetzt greift.