Docker¶
Dokumenttyp: Developer Playbook
Status: Draft v0.2
Stand: 2026-06-30
Prinzip: Allgemeine Anleitung mit Praxisbeispiel aus Immohai
Ziel¶
Dieses Dokument erklärt, was Docker ist, warum Docker für kleine und mittlere Webprojekte sinnvoll ist und wie Docker auf einem Ubuntu-Server grundsätzlich eingerichtet und geprüft wird.
Die konkrete Veröffentlichung von Docker-Diensten über lokale Ports, Nginx und HTTPS wird im Kapitel 06 Veröffentlichung beschrieben.
Kurz erklärt¶
Docker ist eine Software, mit der Anwendungen in sogenannten Containern ausgeführt werden.
Ein Container enthält alles, was ein Dienst zum Laufen braucht:
- Anwendung
- Laufzeitumgebung
- Abhängigkeiten
- Konfiguration
- Startbefehl
Dadurch läuft ein Dienst auf verschiedenen Systemen möglichst gleich.
Warum Docker?¶
Ohne Docker müssen Programme direkt auf dem Server installiert werden.
Das führt schnell zu Problemen:
- unterschiedliche Python-, Node- oder Systemversionen
- schwer nachvollziehbare Serverzustände
- manuelle Installationen
- Konflikte zwischen Projekten
- schwierige Wiederherstellung nach Fehlern
Mit Docker wird ein Dienst isoliert betrieben.
Das macht Projekte:
- reproduzierbarer
- wartbarer
- leichter übertragbar
- sauberer trennbar
- einfacher zu starten und zu stoppen
Grundprinzip¶
Server
↓
Docker
↓
Container
↓
App, Dokumentation, Datenbank oder anderer Dienst
Beispiel:
Ubuntu Server
↓
Docker
↓
immohai-web
↓
statische Immohai App
Ein zweiter Container kann parallel die Dokumentation betreiben:
Ubuntu Server
↓
Docker
↓
immohai-docs
↓
MkDocs Dokumentation
Wichtige Begriffe¶
| Begriff | Bedeutung |
|---|---|
| Image | Vorlage für einen Container |
| Container | laufende Instanz eines Images |
| Dockerfile | Bauanleitung für ein eigenes Image |
| Volume | eingebundener Speicherbereich |
| Port | Verbindung zwischen Host und Container |
| Registry | Speicherort für Images, z. B. Docker Hub |
| Docker Compose | Verwaltung mehrerer Container über eine YAML-Datei |
Image und Container¶
Ein Image ist eine Vorlage.
Ein Container ist ein laufender Dienst auf Basis dieser Vorlage.
Beispiel:
Image: nginx:latest
Container: immohai-web
Das Image beschreibt, was gestartet werden kann.
Der Container ist das tatsächlich laufende Exemplar.
Docker Hub¶
Docker Hub ist eine öffentliche Registry für Docker Images.
Beispiele für Images:
nginx:latest
postgres:16
python:3.12
squidfunk/mkdocs-material:latest
Für kleine Projekte ist es üblich, zunächst offizielle oder etablierte Images zu verwenden.
Docker Engine¶
Docker Engine ist die eigentliche Docker-Laufzeitumgebung auf dem Server.
Sie startet, stoppt und verwaltet Container.
Wichtige Bestandteile:
| Bestandteil | Zweck |
|---|---|
| Docker Engine | führt Container aus |
| Docker CLI | Kommandozeilenwerkzeug docker |
| containerd | Container-Laufzeitkomponente |
| Docker Compose Plugin | startet mehrere Dienste über docker compose |
| buildx | erweitert den Image-Build-Prozess |
Installation auf Ubuntu¶
Docker sollte über das offizielle Docker-Repository installiert werden.
Nicht empfohlen ist eine unkontrollierte Installation über zufällige Skripte aus dem Internet.
Die genaue Installationsmethode kann sich je nach Ubuntu-Version ändern. Deshalb sollte bei produktiver Einrichtung immer die offizielle Docker-Dokumentation geprüft werden.
Typischer Ablauf:
sudo apt update
sudo apt install ca-certificates curl gnupg -y
Docker-Repository hinzufügen und Docker installieren.
Danach prüfen:
docker --version
docker compose version
Docker-Dienst prüfen¶
Status prüfen:
sudo systemctl status docker
Docker starten:
sudo systemctl start docker
Docker beim Systemstart aktivieren:
sudo systemctl enable docker
Testcontainer ausführen¶
Nach der Installation sollte Docker mit einem Testcontainer geprüft werden:
docker run hello-world
Wenn Docker korrekt funktioniert, lädt Docker das Test-Image herunter und führt es aus.
Erwartung:
Hello from Docker!
Benutzerrechte¶
Standardmäßig benötigt Docker erhöhte Rechte.
Damit ein normaler Benutzer Docker-Befehle ausführen kann, wird er häufig zur Gruppe docker hinzugefügt.
sudo usermod -aG docker $USER
Danach neu anmelden oder Gruppe neu laden:
newgrp docker
Prüfen:
docker ps
Wichtig:
Die Docker-Gruppe hat weitreichende Rechte auf dem System. Nur vertrauenswürdige Benutzer sollten Mitglied dieser Gruppe sein.
Wichtige Docker-Befehle¶
| Befehl | Zweck |
|---|---|
docker ps |
laufende Container anzeigen |
docker ps -a |
alle Container anzeigen |
docker images |
lokale Images anzeigen |
docker logs <container> |
Logs eines Containers anzeigen |
docker stop <container> |
Container stoppen |
docker start <container> |
Container starten |
docker restart <container> |
Container neu starten |
docker rm <container> |
gestoppten Container entfernen |
docker rmi <image> |
Image entfernen |
docker system df |
Speicherverbrauch anzeigen |
Container anzeigen¶
docker ps
Übersichtlicher:
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
Damit sieht man:
- Containername
- verwendetes Image
- Status
- Portbelegung
Logs anzeigen¶
docker logs <container-name>
Letzte 100 Zeilen:
docker logs <container-name> --tail=100
Logs live verfolgen:
docker logs <container-name> -f
Container stoppen und entfernen¶
Container stoppen:
docker stop <container-name>
Container entfernen:
docker rm <container-name>
Wichtig:
Container nur entfernen, wenn klar ist, dass sie nicht mehr gebraucht werden oder über Docker Compose wiederhergestellt werden können.
Docker und Ports¶
Docker kann Container-Ports auf Host-Ports abbilden.
Beispiel:
127.0.0.1:8200:80
Bedeutung:
| Teil | Bedeutung |
|---|---|
127.0.0.1 |
nur lokal auf dem Server erreichbar |
8200 |
Port auf dem Server |
80 |
Port im Container |
Für Dienste hinter Nginx sollte 127.0.0.1 verwendet werden.
Nicht empfohlen:
ports:
- "80:80"
Empfohlen:
ports:
- "127.0.0.1:8200:80"
Die konkrete Port-Strategie wird im Kapitel 06 Veröffentlichung beschrieben.
Docker und Volumes¶
Ein Volume verbindet Daten oder Ordner vom Server mit einem Container.
Beispiel:
volumes:
- ./frontend:/usr/share/nginx/html:ro
Bedeutung:
| Teil | Bedeutung |
|---|---|
./frontend |
Ordner im Projekt |
/usr/share/nginx/html |
Zielpfad im Container |
:ro |
read-only, also nur lesend |
Volumes sind wichtig, wenn Container auf Projektdateien, Konfigurationsdateien oder persistente Daten zugreifen müssen.
Docker Compose¶
Für mehrere Dienste wird Docker normalerweise nicht mit einzelnen docker run-Befehlen betrieben.
Stattdessen wird Docker Compose verwendet.
Docker Compose nutzt eine Datei:
docker-compose.yml
Dort werden alle Dienste eines Projekts beschrieben.
Beispiele:
- Webapp
- Dokumentation
- Backend
- Datenbank
- Cache
- Worker
Docker Compose wird im nächsten Kapitel separat beschrieben.
Praxisbeispiel Developer Playbook¶
Das Developer Playbook läuft als MkDocs-Container.
Containername:
developer-playbook-docs
Lokaler Port:
127.0.0.1:8100
Image:
squidfunk/mkdocs-material:latest
Prüfen:
cd /home/fober/workspace/developer-playbook
docker compose ps
curl -I http://127.0.0.1:8100
Praxisbeispiel Immohai¶
Immohai nutzt Docker für:
- statische App-Auslieferung
- Projektdokumentation mit MkDocs
Aktuelle Container:
immohai-web
immohai-docs
Lokale Ports:
127.0.0.1:8200 → Immohai App
127.0.0.1:8201 → Immohai Dokumentation
Prüfen:
cd /home/fober/projects/immohai
docker compose ps
curl -I http://127.0.0.1:8200
curl -I http://127.0.0.1:8201
Docker im Gesamtsetup¶
Docker ist nur eine Ebene im gesamten Veröffentlichungsprozess.
Docker
↓
lokaler Port
↓
Nginx Reverse Proxy
↓
HTTPS mit Certbot
↓
öffentliche Domain
Docker startet die Dienste.
Nginx macht sie öffentlich erreichbar.
Certbot sorgt für HTTPS.
Sicherheit¶
Docker erleichtert den Betrieb, ersetzt aber keine Sicherheitsmaßnahmen.
Wichtig:
- keine Secrets in Images einbauen
- keine
.env-Dateien mit Secrets committen - Container nicht unnötig als root betreiben
- nur benötigte Ports veröffentlichen
- Dienste hinter Nginx nur lokal binden
- Images regelmäßig aktualisieren
- alte Container und Images bewusst aufräumen
- produktive Daten in Volumes sichern
Typische Fehler¶
| Fehler | Ursache | Lösung |
|---|---|---|
docker: command not found |
Docker ist nicht installiert | Docker installieren |
permission denied |
Benutzer ist nicht in Docker-Gruppe | Benutzer zur Gruppe docker hinzufügen |
| Container startet nicht | falsche Konfiguration oder fehlende Datei | Logs prüfen |
| Port ist belegt | anderer Container nutzt den Port | docker ps und ss prüfen |
| Container ist öffentlich erreichbar | Port auf 0.0.0.0 gebunden |
auf 127.0.0.1 beschränken |
| Änderung wird nicht sichtbar | Container wurde nicht neu gestartet | docker compose restart |
| Daten verschwinden nach Neustart | keine Volumes verwendet | persistente Daten in Volumes legen |
Best Practices¶
- Docker über das offizielle Repository installieren.
- Docker Compose für Projekte mit mehreren Diensten verwenden.
- Container sprechend benennen.
- Ports immer dokumentieren.
- Für Dienste hinter Nginx lokale Ports verwenden.
- Volumes bewusst und nachvollziehbar einsetzen.
- Images regelmäßig aktualisieren.
- Logs bei Fehlern zuerst prüfen.
- Keine Secrets in Images oder Markdown-Dateien speichern.
- Produktive Daten sichern.
Checkliste¶
- [ ] Docker installiert
- [ ] Docker-Dienst läuft
- [ ] Docker startet beim Systemstart
- [ ]
docker --versiongeprüft - [ ]
docker compose versiongeprüft - [ ] Testcontainer
hello-worlderfolgreich - [ ] Benutzerrechte geprüft
- [ ] wichtige Docker-Befehle bekannt
- [ ] Containerstatus mit
docker psgeprüft - [ ] Logs können gelesen werden
- [ ] Portbindung verstanden
- [ ] Volumes verstanden
- [ ] Docker Compose als nächster Schritt verstanden