Zum Inhalt

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 --version geprüft
  • [ ] docker compose version geprüft
  • [ ] Testcontainer hello-world erfolgreich
  • [ ] Benutzerrechte geprüft
  • [ ] wichtige Docker-Befehle bekannt
  • [ ] Containerstatus mit docker ps geprüft
  • [ ] Logs können gelesen werden
  • [ ] Portbindung verstanden
  • [ ] Volumes verstanden
  • [ ] Docker Compose als nächster Schritt verstanden