Container

Aus Zweites Gehirn, dem persönlichen Wiki
Container
TypKonzept
QuellenQuelle - Docker Bootcamp
Quelle - Recherche - Docker heute 2026
Erstellt2026-09-27
Aktualisiert2026-09-27
Tagsdocker, container, virtualisierung, devops

Ein Container ist eine vom restlichen System isolierte Umgebung, die eine Anwendung mit Code und allen Abhängigkeiten enthält und überall gleich läuft. Er entsteht aus einem unveränderlichen Image, bekommt eine eigene beschreibbare Schicht, speichert dauerhafte Daten in Volumes oder Bind Mounts und kommuniziert über Netzwerke und veröffentlichte Ports.

Idee

Ein Container ist ein Paket aus Code und allen Abhängigkeiten (Dependencies). Er läuft getrennt von anderen Containern und auf verschiedenen Betriebssystemen gleich (Quelle - Docker Bootcamp, Folie 15). Im Unterschied zur virtuellen Maschine teilt er sich den Kernel mit dem Host (siehe Virtualisierung). Die Standard-Software dafür ist Docker.

Image und Container

  • Ein Image ist der Bauplan eines Containers: ein Paket mit allen Daten und Konfigurationen. Es ist nach dem Erstellen unveränderlich (read-only). Vergleich aus der objektorientierten Programmierung: Das Image ist die Klasse, der Container das Objekt (Folie 39).
  • Ein Image besteht aus Schichten (Layers). Jede Schicht enthält nur die Änderungen gegenüber der vorherigen, ähnlich einem diff. Bei einem Update werden nur geänderte Schichten heruntergeladen (Folie 46).
  • Images kommen aus einer Registry, meist Docker Hub. Auf „Official Image“ und Downloadzahl achten (Folie 40).
  • Tags unterscheiden Versionen: python:3.10. Ohne Tag gilt latest. Umbenennen lässt sich ein Image nicht, nur mit weiteren Tags versehen (Folien 49–51).
  • Ein Container legt seine Änderungen in einer eigenen beschreibbaren Schicht (writable layer) ab. Von aussen kommt man nicht direkt daran, und beim Löschen des Containers ist sie weg (Folien 60, 100).

Lebenszyklus

docker run fasst drei Schritte zusammen (Folien 55–59):

  1. docker pull – Image herunterladen
  2. docker create – Container erzeugen
  3. docker start – Container starten

docker run erzeugt deshalb jedes Mal einen neuen Container. Einen bestehenden startet man mit docker start.

docker run -it --rm ubuntu              # interaktiv, nach Ende automatisch löschen
docker run --name ubuntu-test -it ubuntu
docker start -i ubuntu-test             # bestehenden Container wieder starten
docker exec -it ubuntu-test bash        # zusätzliches Programm im laufenden Container
docker container ls -a -s               # alle Container mit Grösse
docker stop | pause | unpause | rm ubuntu-test
  • -i (interaktiv) und -t (Pseudo-Terminal) braucht man für die Arbeit im Terminal. -t muss schon beim Erzeugen gesetzt sein (Folien 55–56).
  • Jeder Container startet ein Standardprogramm, etwa die bash bei Ubuntu oder die Python-Shell bei Python. Es lässt sich beim Start ersetzen: docker run [Optionen] IMAGE [KOMMANDO] (Folie 72).
  • Endet der Hauptprozess, endet der Container. Für Dienste startet man ihn mit -d im Hintergrund und liest die Ausgabe mit docker logs (Folie 81).
  • Restart-Policy: no (Standard), on-failure, always, unless-stopped, z.B. docker run -d --restart unless-stopped nginx (Folie 83).
  • Informationen: docker inspect, docker container stats, gezielt mit Go-Template-Syntax, z.B. --format="{{.Created}}" (Folien 47, 63).

Daten

Art Was Wofür
writable layer Änderungen im Container selbst geht mit dem Container verloren
docker cp Dateien in den Container oder heraus kopieren, auch wenn er nicht läuft schnell, performant, gut im Produktivbetrieb
Bind Mount Ordner des Hosts im Container einhängen Entwicklung: Änderungen sind sofort sichtbar, aber etwas Overhead
Volume von Docker verwalteter Speicher (unter Linux in /var/lib/docker/volumes/) Datenbanken und andere dauerhafte Daten, effizient
tmpfs nur im Arbeitsspeicher, nur unter Linux sensible Daten, verschwinden beim Anhalten

(Folien 98–130)

docker run -v $(pwd):/usr/share/nginx/html nginx          # Bind Mount (absoluter Pfad)
docker run -v $(pwd):/data:ro ...                         # nur lesend
docker volume create mariadb-vol
docker run -v mariadb-vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=... mariadb
  • -v legt einen fehlenden Host-Ordner selbst an, --mount type=bind,... verlangt, dass er existiert (Folie 106).
  • Bei -v name:/pfad entsteht ein Volume, bei -v /absoluter/pfad:/pfad ein Bind Mount. Vorsicht: Die Schreibweisen sind leicht zu verwechseln (Folie 125).
  • Datenbank aktualisieren ohne Datenverlust: Daten in ein Volume legen, den Container löschen und mit neuerer Version und demselben Volume neu erstellen. MariaDB ist nicht abwärtskompatibel, ein Downgrade kann den Container abstürzen lassen (Folie 129).
  • Praktisches Beispiel: Markdown mit Pandoc und LaTeX in PDF umwandeln, ohne etwas zu installieren: docker run --rm -v $(pwd):/data pandoc/latex README.md -o outfile.pdf (Folien 117–119).

Netzwerk und Ports

  • Jeder Container hat eine eigene virtuelle Netzwerkschnittstelle. Ports werden nicht automatisch weitergeleitet, darum können mehrere Container denselben Port 80 benutzen (Folie 87).
  • -p Host-Port:Container-Port veröffentlicht einen Port: docker run -p 8888:80 --rm nginx, dann ist nginx unter http://localhost:8888 erreichbar (Folie 88).
  • Netzwerktreiber (Folien 133–137):
    • bridge (Standard): privates Subnetz (172.x.x.x) auf einem Host, Container sehen sich, sind von aussen abgeschottet.
    • host: keine Isolation, Container nutzt die Netzwerkadresse des Hosts, nur unter Linux.
    • none: kein Netzwerk.
    • overlay: über mehrere Hosts, bei Docker Swarm (siehe Container-Orchestrierung).
  • Eigene Netzwerke schotten Anwendungen voneinander ab: docker network create my-network, docker run --network my-network .... Container im selben Netzwerk erreichen sich über ihren Namen. Beispiel: phpMyAdmin mit -e PMA_HOST=my-mariadb findet den Datenbank-Container (Folien 139–147).
Einordnung (Claude)

Die Trennung von unveränderlichem Image und wegwerfbarem Container passt zum Prinzip „Infrastruktur als Code“: Nicht der laufende Server wird gepflegt, sondern die Beschreibung, aus der er jederzeit neu entsteht (siehe Dockerfile). Dasselbe Muster verfolgt dieses Wiki mit der Webseite: site/ wird nie von Hand bearbeitet, sondern immer aus wiki/ neu gebaut. Für die Sicherheit heisst das: Daten in Volumes gehören ins Backup, Container selbst nicht (siehe Sicherheit des eigenen Vaults). Eigene Netzwerke und nur nötige Ports entsprechen dem Prinzip der minimalen Angriffsfläche aus der Netzwerksicherheit.

Verwandt