# Portabilitaet: UNIVERSAL
# Zuletzt validiert: 2026-03-08 (Claude/BACH wiki-author)
# Naechste Pruefung: 2027-03-08
# Quellen: docs.docker.com, The Docker Book (Turnbull), Docker Deep Dive (Poulton)

DOCKER - CONTAINERISIERUNG FUER SOFTWARE
=========================================

Stand: 2026-03-08
Sprache: DE


WAS IST DOCKER?
----------------
Docker ist eine Plattform zur Containerisierung von Software. Ein Container
ist eine leichtgewichtige, isolierte Laufzeitumgebung -- wie eine Mini-VM,
aber ohne eigenes Betriebssystem. Der Container teilt sich den Kernel des
Host-Systems und startet in Sekunden statt Minuten.

Docker loest das Problem "Laeuft auf meinem Rechner" -- jeder bekommt
exakt dieselbe Umgebung, unabhaengig vom Betriebssystem.


KERNKONZEPTE
-------------

  Image
  -----
    Unveraenderliche Vorlage (read-only). Enthaelt OS-Basis, Dependencies
    und Anwendungscode. Wird aus einem Dockerfile gebaut. Images sind
    schichtbasiert (Layers) -- gleiche Basis-Schichten werden geteilt.

  Container
  ---------
    Laufende Instanz eines Images. Isoliert durch Linux-Namespaces und
    cgroups. Kurzlebig und wegwerfbar -- Daten gehen verloren wenn der
    Container geloescht wird (ausser bei Volumes).

  Dockerfile
  ----------
    Textdatei mit Bauanleitung fuer ein Image. Jede Anweisung erzeugt
    eine neue Schicht. Reihenfolge ist wichtig fuer Cache-Effizienz.

  Registry
  --------
    Speicher fuer Images. Docker Hub ist die oeffentliche Standard-Registry.
    Private Registries: GitHub Container Registry (ghcr.io), Amazon ECR,
    Google GCR, Azure ACR.

  Volume
  ------
    Persistenter Speicher, der Container-Neustarts und -Loeschungen
    ueberlebt. Wird am Host-Dateisystem gemountet.

  Docker Compose
  --------------
    Tool um Multi-Container-Setups deklarativ zu definieren. Eine einzige
    YAML-Datei beschreibt alle Services, Netzwerke und Volumes.

  Netzwerk
  --------
    Container kommunizieren ueber virtuelle Netzwerke. Standard-Typen:
    bridge (Standard, isoliert), host (teilt Host-Netzwerk), none (kein
    Netzwerk). In Compose koennen Services sich per Name ansprechen.


ABGRENZUNG: CONTAINER VS. VIRTUELLE MASCHINE
----------------------------------------------

  Eigenschaft       Container           VM
  ----------------------------------------------------------------
  Isolation         Prozess-Level       Hardware-Level
  Kernel            Geteilt mit Host    Eigener Kernel
  Startzeit         Sekunden            Minuten
  Groesse           MBs                 GBs
  Overhead          Minimal             Erheblich (Hypervisor)
  Portabilitaet     Sehr hoch           Mittel
  Sicherheit        Weniger isoliert    Staerker isoliert


DOCKERFILE -- BEST PRACTICES
------------------------------

  Beispiel (Python-Anwendung):

    FROM python:3.12-slim
    WORKDIR /app

    # Dependencies zuerst kopieren (Cache-Optimierung)
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt

    # Dann den Anwendungscode
    COPY src/ ./src/

    # Non-root User fuer Sicherheit
    RUN useradd -m appuser
    USER appuser

    EXPOSE 8000
    CMD ["python", "-m", "uvicorn", "src.main:app", "--host", "0.0.0.0"]

  Tipps:
    - Kleine Base-Images verwenden (slim, alpine)
    - .dockerignore pflegen (wie .gitignore)
    - Selten geaenderte Schichten zuerst (Cache!)
    - Multi-Stage Builds fuer kleinere Produktions-Images
    - Nie als root laufen in Produktion
    - COPY statt ADD (expliziter)
    - Ein Prozess pro Container


WICHTIGE BEFEHLE
-----------------

  Images:
    docker build -t myapp:1.0 .           Bauen
    docker images                          Auflisten
    docker rmi myapp:1.0                   Loeschen
    docker pull nginx:latest               Herunterladen
    docker push myrepo/myapp:1.0           Hochladen

  Container:
    docker run -d -p 8080:80 nginx         Starten (detached, Port-Mapping)
    docker run -it ubuntu bash             Interaktiv starten
    docker ps                              Laufende anzeigen
    docker ps -a                           Alle anzeigen (inkl. gestoppte)
    docker stop <container>                Stoppen
    docker rm <container>                  Loeschen
    docker logs <container>                Logs anzeigen
    docker exec -it <container> bash       Shell im Container

  Volumes:
    docker volume create mydata            Erstellen
    docker run -v mydata:/app/data ...     Mounten
    docker volume ls                       Auflisten

  System:
    docker system prune                    Aufraeumen (ungenutzte Ressourcen)
    docker stats                           Ressourcen-Verbrauch live


DOCKER COMPOSE
---------------

  Beispiel (Web-App + Datenbank):

    # docker-compose.yml
    services:
      web:
        build: .
        ports:
          - "8000:8000"
        environment:
          - DATABASE_URL=postgresql://db:5432/app
        depends_on:
          - db
        restart: unless-stopped

      db:
        image: postgres:16
        volumes:
          - pgdata:/var/lib/postgresql/data
        environment:
          - POSTGRES_DB=app
          - POSTGRES_PASSWORD=${DB_PASSWORD}

    volumes:
      pgdata:

  Befehle:
    docker compose up -d                   Alle Services starten
    docker compose down                    Alle Services stoppen + entfernen
    docker compose logs -f web             Logs eines Services folgen
    docker compose ps                      Status anzeigen
    docker compose build                   Alle Images neu bauen


PRAXISBEISPIELE
----------------

  1. n8n (Workflow-Automatisierung):
     docker run -d --name n8n -p 5678:5678 n8nio/n8n

  2. PostgreSQL (Datenbank):
     docker run -d --name pg -p 5432:5432 -e POSTGRES_PASSWORD=secret postgres:16

  3. Nginx (Webserver):
     docker run -d -p 80:80 -v ./html:/usr/share/nginx/html nginx

  4. Entwicklungsumgebung:
     docker run -it --rm -v $(pwd):/app -w /app python:3.12 bash


SICHERHEIT
-----------
  - Nie als root im Container laufen
  - Offizielle Base-Images verwenden
  - Images regelmaessig aktualisieren (Sicherheitspatches)
  - Secrets nie im Image hartcodieren (Environment-Variablen, Docker Secrets)
  - Container-Image-Scanning einsetzen (Trivy, Snyk)
  - Read-only Dateisysteme wo moeglich (--read-only)
  - Resource Limits setzen (--memory, --cpus)


SIEHE AUCH
-----------
  wiki/informatik/devops/README.txt              DevOps Gesamtuebersicht
  wiki/informatik/devops/docker_en.txt           Docker (English)
  wiki/n8n.txt                                   n8n Workflow-Automatisierung
  wiki/informatik/cloud_computing/               Cloud-Plattformen
