Docker & Podman

Was ist Docker?

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.

Docker-Konzepte

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

Dockerfile

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

Das Layer-Konzept

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 Layer

Dockerfile – Beispiel

Einfacher 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.0

Docker-Befehle Cheat-Sheet

Images:
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 auflisten

Docker Compose

Docker 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 down

Docker-Netzwerke

Netzwerk-Typ

Beschreibung

Einsatz

bridge

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 – Die rootless Alternative

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

systemd

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 umleiten

Container-Registries

Registry

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

Zusammenfassung

  • 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