Direkt zum Inhalt

Cookie-Einstellungen

Wählen Sie, welche Arten von Cookies Sie erlauben. Sie können Ihre Auswahl jederzeit über Cookie-Einstellungen unten auf jeder Seite ändern. Datenschutzerklärung

Notwendig

Immer aktiv

Nötig zum Einloggen, für Ihren Warenkorb und um Ihre Auswahl zu speichern. Diese sind immer aktiv.

Welche Cookies?
  • weboke_sessie, weboke_klant, weboke_remember: Ihre Sitzung und eingeloggt bleiben
  • weboke_basket: Ihr Warenkorb
  • wkBtwIncl: Preise mit oder ohne MwSt. anzeigen
  • wok_cookies: Ihre Cookie-Auswahl, 12 Monate

Misst, welche Anzeige zu einem Besuch oder einer Bestellung führt, damit wir nicht für Anzeigen zahlen, die nichts bringen.

Welche Cookies?
  • Google Ads über Google Tag Manager (_gcl_au, _gcl_aw), bis zu 90 Tage
  • OpenAI Ads, Anzeigen in ChatGPT
  • wok_aff: über welchen Partner Sie zu uns kamen (Partnerprogramm), 60 Tage

4,6

Land und Sprache

Jedes Land hat seine eigene Website, mit Preisen und MwSt. dieses Landes.

Anzeigen

Modul 9 · 9.1

Container verstehen

Modul 9: Docker und docker compose · Lesezeit: 10 Minuten

Lernziel: Nach dieser Lektion können Sie erklären, was ein Container ist, wie er sich von einer virtuellen Maschine unterscheidet, wo die Daten eines Containers bleiben und wann Docker auf Ihrem Server sinnvoll ist.

Kernbegriffe: Image, Container, Schicht, Registry (Docker Hub), Tag, Digest, Namespaces, cgroups, gemeinsamer Kernel, flüchtiges Dateisystem, Volume, Bind Mount, Port veröffentlichen, offizielles Image

Warum Container?

Angenommen, Sie möchten auf Ihrem VPS eine Statusseite betreiben, die anzeigt, ob Ihre Website funktioniert. Das Programm ist in Node.js geschrieben, benötigt eine bestimmte Version davon und dazu rund zweihundert Bibliotheken. Ohne Container installieren Sie all das auf Ihrem Server, neben Ihrem Webserver und Ihrer Datenbank. Ein Jahr später möchten Sie ein zweites Programm, das eine andere Node.js-Version benötigt. Dann beginnt das Gepuzzle.

Ein Container löst dieses Problem. Der Hersteller des Programms liefert das Programm zusammen mit allem, was es braucht, in einem Paket: einem Image. Auf Ihrem Server starten Sie dieses Image als Container. Das Programm sieht seine eigenen Dateien, sein eigenes Node.js, seine eigenen Bibliotheken und kommt dem Rest Ihres Servers nicht in die Quere. Soll es wieder weg? Container entfernen, Image entfernen, und in /usr oder /etc bleibt nichts zurück.

Docker ist das bekannteste Werkzeug, um Images herunterzuladen und Container auszuführen. Es gibt Alternativen (Podman, containerd selbst), aber die Begriffe sind überall dieselben.

Image, Container und Registry

Drei Begriffe, die Ihnen immer wieder begegnen:

  • Image: eine schreibgeschützte Vorlage mit einem Dateisystem (Programm, Bibliotheken, Einstellungen) und dem Befehl, der gestartet werden soll. Ein Image besteht aus Schichten (Layers): einer Basisschicht (zum Beispiel ein nacktes Debian), darauf eine Schicht mit Node.js, darauf das Programm. Zwei Images mit derselben Basisschicht teilen sich diese Schicht auf Ihrer Festplatte.
  • Container: eine laufende (oder gestoppte) Instanz eines Images. Über den schreibgeschützten Schichten erhält der Container eine eigene dünne Schreibschicht. Aus einem Image können Sie zehn Container starten.
  • Registry: der Ort, an dem Images liegen, etwa Docker Hub (docker.io) oder die Registry von GitHub (ghcr.io). Docker lädt ein Image mit docker pull herunter.

Der Name eines Images sieht so aus:

louislam/uptime-kuma:2
caddy:2
vaultwarden/server:latest

Der Teil nach dem Doppelpunkt ist das Tag: eine Bezeichnung für eine Version. Ein Tag kann sich ändern: caddy:2 verweist heute auf einen anderen Build als in drei Monaten, sobald eine neue 2.x erscheint. Möchten Sie genau festlegen, welches Image Sie ausführen, verwenden Sie den Digest: einen Fingerabdruck des Inhalts, etwa caddy@sha256:.... Dieser ändert sich nie. Das Tag latest ist einfach ein Name, den der Hersteller wählt; es bedeutet nicht automatisch "die neueste stabile Version" und ist daher eine schlechte Wahl, wenn Sie wissen möchten, was läuft.

Keine virtuelle Maschine

Ein Container ähnelt einer kleinen virtuellen Maschine, ist aber keine. Dieser Unterschied ist für die Sicherheit wichtig.

Virtuelle Maschine (wie Ihr VPS)Container
KernelEigener KernelTeilt den Kernel des Hosts
StartenSekunden bis Minuten, ein komplettes BetriebssystemMeist in einer Sekunde, nur das Programm
TrennungDurch den Hypervisor, auf HardwareebeneDurch den Kernel: Namespaces und cgroups
GrößeGigabytesOft zehn bis einige hundert Megabytes

Ein Container ist im Grunde ein gewöhnlicher Prozess auf Ihrem Server, den der Kernel in eine abgeschirmte Umgebung setzt:

  • Namespaces sorgen dafür, dass der Prozess seine eigene Sicht auf Dateien, Prozesse, Netzwerk und Benutzer hat. Im Container scheint das Programm Prozess Nummer 1 zu sein und sieht den Rest Ihres Servers nicht;
  • cgroups begrenzen, wie viel Prozessorleistung und Arbeitsspeicher es nutzen darf.

Da alle Container denselben Kernel teilen, ist die Trennung weniger streng als zwischen zwei VPS. Eine Sicherheitslücke im Kernel oder ein Container mit zu vielen Rechten kann den Host gefährden. Daher die Regeln aus diesem Modul: Führen Sie nur Images aus, denen Sie vertrauen, geben Sie Containern nicht mehr Rechte als nötig, und binden Sie niemals /var/run/docker.sock oder / in einen Container ein (Lektion 9.3 und 10.2).

Wo bleiben Ihre Daten?

Das ist die klassische Falle für Einsteiger. Die Schreibschicht eines Containers ist flüchtig: Entfernen Sie den Container (zum Beispiel bei einem Update, Lektion 9.4), ist alles weg, was das Programm darin geschrieben hat. Daten, die erhalten bleiben sollen, gehören deshalb außerhalb des Containers:

  • Volume: ein Speicherort, den Docker selbst verwaltet (unter /var/lib/docker/volumes/). Sie geben ihm einen Namen, zum Beispiel uptime-kuma, und verknüpfen es mit einem Verzeichnis im Container: -v uptime-kuma:/app/data.
  • Bind Mount: ein normales Verzeichnis auf Ihrem Server, das Sie in den Container einhängen: -v /srv/vaultwarden:/data. Praktisch, weil Sie die Dateien direkt sehen und einfach in Ihr Backup (Modul 8) aufnehmen können.

Einen Container mit gut eingerichteten Volumes können Sie wegwerfen und neu erstellen, ohne etwas zu verlieren. Genau so funktioniert ein Update: neues Image herunterladen, alten Container entfernen, neuen Container mit denselben Volumes starten. Nehmen Sie die Volumes daher in Ihren Backup-Plan auf (Lektion 8.1).

Ports veröffentlichen

Ein Container hat sein eigenes Netzwerk. Ein Webprogramm, das im Container auf Port 3001 lauscht, ist von außerhalb des Servers nicht erreichbar, bis Sie diesen Port veröffentlichen: -p 3001:3001 (Host-Port:Container-Port). Achtung: Ohne Adresse veröffentlicht Docker den Port auf allen Adressen Ihres Servers, also 0.0.0.0 und [::]. Das bedeutet: aus dem gesamten Internet erreichbar, und Docker regelt das an ufw vorbei (Lektion 9.3). Die sichere Gewohnheit ist, auf Loopback zu veröffentlichen, -p 127.0.0.1:3001:3001, und einen Reverse Proxy mit https davorzuschalten (Lektion 9.4).

Wer erstellt das Image?

Ein Image ist Software von jemand anderem, die als root auf Ihrem Server laufen kann. Prüfen Sie daher, wer der Hersteller ist:

  • Docker Official Images (wie caddy, nginx, postgres) werden von Docker gemeinsam mit den Herstellern gepflegt;
  • Images des Herstellers selbst (wie louislam/uptime-kuma und vaultwarden/server), erkennbar an dem Namen, den die Projektwebsite nennt;
  • Images von Unbekannten mit ähnlich klingenden Namen: nicht verwenden.

Verwenden Sie immer den Namen, der auf der offiziellen Website des Projekts steht, nicht den ersten, den eine Suche liefert.

Wann ja, wann nein?

Docker ist praktisch für Programme, die der Hersteller als Image liefert, für Dienste, die Sie schnell wegwerfen oder umziehen möchten, und um mehrere Programme mit unterschiedlichen Anforderungen nebeneinander zu betreiben. Für die Grundlagen Ihres Servers (SSH, Firewall, Updates) verwenden Sie keine Container. Und eine einzelne Website mit nginx und PHP aus der Paketquelle (Lektion 7.2) funktioniert auch ohne Docker bestens. Ein Container fügt eine Schicht hinzu, die Sie verstehen und aktualisieren müssen; setzen Sie ihn ein, wenn er einen Nutzen bringt.

Zusammenfassung

  • Ein Image ist eine schreibgeschützte Vorlage aus Schichten; ein Container ist eine laufende Instanz mit einer eigenen Schreibschicht.
  • Container teilen den Kernel des Hosts und sind mit Namespaces und cgroups abgeschirmt: leichter als eine VM, aber weniger streng getrennt.
  • Die Schreibschicht ist flüchtig: dauerhafte Daten gehören in ein Volume oder einen Bind Mount, und diese gehören in Ihr Backup.
  • Ein Tag kann sich ändern, ein Digest nicht; latest sagt wenig aus.
  • Veröffentlichen Sie Ports auf 127.0.0.1 und verwenden Sie nur Images des Herstellers oder offizielle Images.

Quiz

1. Was ist der wichtigste Unterschied zwischen einem Container und einer virtuellen Maschine?



2. Sie betreiben einen Container ohne Volume. Das Programm speichert seine Einstellungen in /app/data. Sie entfernen den Container, um eine neue Version zu starten. Was passiert mit den Einstellungen?



3. Warum ist image:latest in einer Produktionsumgebung keine gute Wahl?



4. Sie starten docker run -d -p 8080:80 nginx. Von welchen Adressen aus ist Port 8080 erreichbar?



5. Eine Suche liefert das Image vaultwarden-server-official/vaultwarden. Was tun Sie?



Aufgabe

Aufgabe O9.1: Container oder nicht? Wählen Sie zwei Programme, die Sie auf Ihrem Server betreiben möchten (oder nehmen Sie Uptime Kuma und eine WordPress-Website als Beispiel). Recherchieren Sie für jedes Programm, ob der Hersteller ein offizielles Image liefert und unter welchem Namen, welches Tag Sie wählen würden, welches Verzeichnis die dauerhaften Daten enthält und auf welchem Port es lauscht. Erklären Sie anschließend, ob Sie es in einem Container oder aus der Paketquelle betreiben würden, und warum.

Aufgabe O9.1: Container oder nicht?

Diese Aufgabe machen Sie selbst; niemand prüft sie nach. Haken Sie ab, was Sie erledigt haben, und markieren Sie die Aufgabe als erledigt.




Ihre Haken und Notizen bleiben nur in diesem Browser; wir senden sie nirgendwohin. Sind Sie angemeldet, speichern wir in Meine Kurse nur, dass Sie die Aufgabe erledigt haben.

Weiterführende Informationen

Einen Moment bitte…

Richten Sie Ihre Domains ein

Legen Sie für jede Domain die Nameserver, die Verknüpfung mit Ihrem Hosting und den künftigen Inhaber fest.

Ihre Domains werden geladen…