Docker ist die bekannteste Container-Laufzeitumgebung. 2013 veröffentlicht hat Docker Container-Technologie populär gemacht indem es komplexe Linux-Kernel-Features in eine einfache Benutzeroberfläche und ein klares Konzept verpackte: Build, Ship, Run.
Begriff | Bedeutung | Analogie |
|---|---|---|
Image | Unveränderliche Vorlage für Container | Wie eine VM-Template oder ISO |
Container | Laufende Instanz eines Images | Wie eine gestartete VM |
Bauanleitung für ein Image | Wie ein Rezept | |
Registry | Speicherort für Images | Wie ein App Store für Images |
Volume | Persistenter Datenspeicher | Wie eine externe Festplatte |
Network | Virtuelles Netz für Container | Wie ein vSwitch |
Docker-Images bestehen aus schreibgeschützten Layern die aufeinander aufgebaut werden. Beim Start eines Containers wird ein beschreibbarer Layer oben draufgelegt:
Dockerfile → Image-Layers:
FROM ubuntu:22.04 → Layer 1: Ubuntu-Basis (100 MB)
RUN apt-get install nginx → Layer 2: nginx installiert (50 MB)
COPY index.html /var/www/ → Layer 3: eigene Datei (1 KB)
─────────────────────────────
Image-Größe: ~150 MB
Container-Start:
[Layer 1: Ubuntu] ← read-only
[Layer 2: nginx] ← read-only
[Layer 3: HTML] ← read-only
[Container-Layer] ← read-write (temporär)
Zweiter Container aus demselben Image:
[Layer 1] ← geteilt! (kein doppelter Speicher)
[Layer 2] ← geteilt!
[Layer 3] ← geteilt!
[Container-Layer 2] ← eigener read-write LayerEinfacher Webserver:
# Basis-Image
FROM nginx:alpine
# Metadaten
LABEL maintainer="admin@example.com"
LABEL version="1.0"
# Dateien kopieren
COPY ./html /usr/share/nginx/html
# Port freigeben (nur Dokumentation)
EXPOSE 80
# Startbefehl
CMD ["nginx", "-g", "daemon off;"]
Image bauen:
docker build -t mein-webserver:1.0 .
Container starten:
docker run -d -p 8080:80 --name web mein-webserver:1.0Images:
docker images → Alle lokalen Images
docker pull nginx → Image herunterladen
docker build -t name:tag . → Image aus Dockerfile bauen
docker rmi nginx → Image löschen
docker image prune → Ungenutzte Images löschen
Container:
docker ps → Laufende Container
docker ps -a → Alle Container (auch gestoppt)
docker run -d -p 80:80 nginx → Container starten
docker stop web → Container stoppen
docker start web → Container starten
docker rm web → Container löschen
docker logs web → Logs anzeigen
docker exec -it web bash → Shell im Container öffnen
docker inspect web → Detaillierte Infos
Volumes:
docker volume create mydata → Volume erstellen
docker run -v mydata:/data nginx → Volume einbinden
docker volume ls → Volumes auflisten
Netzwerk:
docker network create mynet → Netzwerk erstellen
docker run --network mynet nginx → Container im Netzwerk
docker network ls → Netzwerke auflistenDocker Compose ermöglicht das Definieren und Starten mehrerer Container als eine Anwendung:
docker-compose.yml Beispiel (WordPress + MySQL):
version: '3.8'
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: geheim
MYSQL_DATABASE: wordpress
volumes:
- db_data:/var/lib/mysql
restart: always
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_PASSWORD: geheim
depends_on:
- db
restart: always
volumes:
db_data:
Starten: docker compose up -d
Stoppen: docker compose downNetzwerk-Typ | Beschreibung | Einsatz |
|---|---|---|
Standard – Container kommunizieren über NAT mit Host | Standard für einzelne Container | |
host | Container teilt Netzwerk-Stack des Hosts | Maximale Performance, keine Port-Mappings |
none | Kein Netzwerk | Komplett isolierte Container |
custom bridge | Eigenes Netzwerk – Container finden sich per Name | Multi-Container-Anwendungen |
overlay | Netzwerk über mehrere Docker-Hosts | Docker Swarm / Kubernetes |
Podman (Pod Manager) ist eine Docker-kompatible Container-Engine ohne Daemon-Prozess:
Merkmal | Docker | Podman |
|---|---|---|
Daemon | dockerd läuft als root | Kein Daemon – daemonless |
Rootless | Eingeschränkt | Vollständig rootless |
Sicherheit | Root-Daemon ist Angriffsfläche | Kein Daemon = weniger Angriffsfläche |
Kompatibilität | Docker-Standard | Docker-kompatibel (gleiche Befehle) |
Pods | Nur mit Compose | Native Pod-Unterstützung |
Eingeschränkt | Sehr gut integriert |
Podman-Befehle sind Docker-kompatibel:
podman run -d -p 80:80 nginx → identisch zu docker run
podman ps → identisch zu docker ps
podman build -t image . → identisch zu docker build
Alias setzen:
alias docker=podman → Docker-Befehle auf Podman umleitenRegistry | URL | Beschreibung |
|---|---|---|
Docker Hub | hub.docker.com | Standard-Registry – Millionen öffentlicher Images |
GitHub Container Registry | ghcr.io | Integriert in GitHub Actions |
Amazon ECR | aws ECR | Private Registry in AWS |
Azure Container Registry | azurecr.io | Private Registry in Azure |
Harbor | selbst-gehostet | Open-Source Private Registry |
Docker verpackt Anwendungen mit allen Abhängigkeiten in portable Images
Images bestehen aus schreibgeschützten Layern – geteilte Layer sparen Speicher
Container sind laufende Instanzen von Images mit einem beschreibbaren Top-Layer
Volumes speichern Daten persistent außerhalb des Containers
Docker Compose verwaltet Multi-Container-Anwendungen per YAML-Datei
Podman ist eine rootless Docker-Alternative ohne Daemon-Prozess
Container-Images werden in Registries gespeichert (Docker Hub, ECR, ACR)
Docker Hub enthält offizielle Images für nginx, mysql, postgres und tausende mehr