suche
ESC

Docker & Container

Images, Container, Compose und Container-Netzwerke verstehen und betreiben.

Second-Level HomeLab 30 Min +180 XP

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.yml beschreibt mehrere services deklarativ — Image, Ports, volumes, environment, depends_on. docker compose up -d startet den ganzen Stack, down rä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 über localhost. Nur die per ports: veröffentlichten Ports (8080:80) sind vom Host aus erreichbar — der Rest bleibt intern.
  • Ports: Schreibweise host:container. 8080:80 mappt 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.

  1. docker compose ps → beide Container laufen, web und db.
  2. Log der App: sie verbindet auf localhost:5432. Im Container ist localhost aber der Container selbst — dort läuft keine DB.
  3. In Compose teilen sich beide ein Netz; db ist per Servicename erreichbar. Die Verbindung muss auf db:5432 zeigen, nicht localhost.
  4. DATABASE_HOST=db in environment: setzen, docker compose up -d neu.
  5. docker logs web → Verbindung steht. docker exec -it web ping db bestä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

▶ Am Tool ausprobieren

Lass dir einen Stack generieren und lies die erzeugte docker-compose.yml Zeile für Zeile — verstehe jedes Feld, bevor du es übernimmst.

  1. Wähle im Generator zwei Dienste, die zusammenarbeiten (z. B. eine App + eine Datenbank).
  2. Beachte, wie volumes für Persistenz und environment für Konfiguration gesetzt werden.
  3. Prüfe, über welchen Servicenamen die App die Datenbank erreichen würde — nicht localhost.
Tool öffnen: /docker-compose ↗

Selbsttest

Praxis-Challenge

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

Tool öffnen: /docker-compose ↗

Reflexion: Was war neu? Wo bist du noch unsicher?

Modul im Speedrun testen →