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

Docker installieren und Ihr erster Container

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

Lernziel: Nach dieser Lektion können Sie Docker Engine aus der offiziellen Paketquelle installieren, Container starten, anzeigen, in sie hineinschauen und aufräumen, und Sie wissen, warum die Gruppe docker root gleichkommt.

Kernbegriffe: Docker Engine, Docker Desktop, offizielle apt-Quelle, docker.io von Debian, Gruppe docker, Rootless Mode, docker run, -d, -p, -v, --name, docker ps, docker logs, docker exec, docker stop, docker rm, docker image prune, docker system df

Welches Docker?

Auf einem Server installieren Sie Docker Engine: den Hintergrunddienst (dockerd) plus den Befehl docker. Docker Desktop ist etwas anderes: ein Programm mit Fenstern für Windows, macOS und Linux-Desktops. Das gehört nicht auf einen Server.

Es gibt zwei saubere Quellen für Docker Engine:

  1. Die Paketquelle von Docker selbst (download.docker.com). Immer die neueste Version, einschließlich des Plug-ins docker compose, das Sie in Lektion 9.3 verwenden. Das beschreibt die Docker-Dokumentation, und das verwendet dieser Kurs.
  2. Das Paket docker.io von Debian oder Ubuntu. Älter, aber von der Distribution über Ihre normalen Sicherheitsupdates aktualisiert (Lektion 4.2). Gut geeignet, wenn Sie lieber nichts von außerhalb der Distribution haben möchten; prüfen Sie dann aber, ob docker compose (mit Leerzeichen) verfügbar ist.

Wählen Sie eine davon. Beide gemischt zu installieren führt zu Konflikten; die Docker-Dokumentation rät deshalb, zuerst inoffizielle Pakete wie docker.io, docker-compose und podman-docker zu entfernen.

Installation aus der Paketquelle von Docker

Dies sind die Schritte aus der Docker-Dokumentation für Debian, mit separatem Schlüssel und eigenem Signed-By (Lektion 4.1). Erstellen Sie vorher einen Snapshot, wenn Ihnen das lieber ist.

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install ca-certificates curl
anna@web1:~$ sudo install -m 0755 -d /etc/apt/keyrings
anna@web1:~$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
anna@web1:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

Danach die Quelldatei /etc/apt/sources.list.d/docker.sources (deb822-Format):

Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

Bei Suites gehört der Codename Ihres Releases hin (cat /etc/os-release, Lektion 4.3) und bei Architectures die Ausgabe von dpkg --print-architecture. Unter Ubuntu lautet die URL https://download.docker.com/linux/ubuntu und die Suite zum Beispiel noble.

Dann installieren:

anna@web1:~$ sudo apt update
anna@web1:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
anna@web1:~$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.

Unter Debian und Ubuntu startet Docker nach der Installation automatisch und auch nach jedem Neustart (systemctl status docker, Lektion 6.1).

Achtung: unattended-upgrades (Lektion 4.2) aktualisiert Pakete aus dieser Quelle standardmäßig nicht automatisch. Nehmen Sie sudo apt update && sudo apt upgrade für Docker in Ihren Wartungsrhythmus auf (Lektion 10.4), oder fügen Sie die Quelle bewusst Ihren automatischen Updates hinzu.

Die Gruppe docker ist root

Überall im Internet liest man, dass Sie sich selbst zur Gruppe docker hinzufügen sollen, damit Sie sudo nicht mehr tippen müssen:

anna@web1:~$ sudo usermod -aG docker anna

Tun Sie das nur, wenn Sie verstehen, was es bedeutet. Die Docker-Dokumentation ist da eindeutig: Die Gruppe docker gewährt Rechte auf root-Ebene. Wer den Docker-Dienst steuern darf, kann einen Container starten, in den die gesamte Festplatte des Hosts eingebunden ist:

docker run -it -v /:/host debian chroot /host

und ist damit root auf Ihrem Server, ohne Passwort und ohne Eintrag im sudo-Log. Die Docker-Dokumentation formuliert es so: Nur vertrauenswürdige Benutzer sollten den Docker-Dienst steuern dürfen.

Für einen Server, den Sie allein verwalten, ist es eine Abwägung: Bequemlichkeit gegen einen zusätzlichen Weg zu root. Sicherer ist es, einfach weiter sudo docker ... zu tippen; dann steht jeder Befehl im sudo-Log (Lektion 3.2). Fügen Sie in keinem Fall einen Benutzer zur Gruppe hinzu, der nicht root sein darf, etwa einen Dienstbenutzer für eine Website.

Rootless Mode

Docker kann auch ohne root laufen: Der Dienst und die Container laufen dann unter einem normalen Benutzer, mit eigenem User Namespace. Sie installieren es als dieser Benutzer mit dockerd-rootless-setuptool.sh install (aus dem Paket docker-ce-rootless-extras; vorher wird das Paket uidmap benötigt). Eine Sicherheitslücke in einem Container führt dann nicht zu root-Rechten auf dem Host. Es gibt Einschränkungen und die Einrichtung ist aufwendiger; in diesem Kurs verwenden wir die normale Installation und sorgen mit den Regeln aus diesem Modul für Sicherheit.

Ein erster echter Container

Wir starten einen nginx-Webserver in einem Container, der nur vom Server selbst erreichbar ist:

anna@web1:~$ sudo docker run -d --name proef -p 127.0.0.1:8080:80 nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
...
3f1c9e0d7a2b...

Die Bestandteile:

TeilBedeutung
-dIm Hintergrund laufen (detached)
--name proefEin Name, damit Sie nicht mit langen IDs arbeiten müssen
-p 127.0.0.1:8080:80Port 80 im Container wird Port 8080 auf dem Host, nur auf Loopback
nginx:stableDas offizielle nginx-Image, Tag stable

Prüfen:

anna@web1:~$ sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  STATUS         PORTS                    NAMES
3f1c9e0d7a2b   nginx:stable   "/docker-entrypoint.…"   Up 5 seconds   127.0.0.1:8080->80/tcp   proef
anna@web1:~$ curl -I http://127.0.0.1:8080
HTTP/1.1 200 OK
Server: nginx/1.28.0
anna@web1:~$ sudo ss -tlnp | grep 8080
LISTEN 0 4096 127.0.0.1:8080 0.0.0.0:* users:(("docker-proxy",pid=2211,fd=7))

ss (Lektion 5.1) bestätigt: nur auf 127.0.0.1. Hätten Sie -p 8080:80 getippt, stünde dort 0.0.0.0:8080 und [::]:8080, und Ihr Container wäre aus dem Internet erreichbar, auch wenn ufw Port 8080 nicht zulässt (Lektion 9.3). Die Version im Server-Header kann bei Ihnen abweichen.

Umsehen und eingreifen

anna@web1:~$ sudo docker logs proef            # was das Programm ausgegeben hat (stdout und stderr)
anna@web1:~$ sudo docker logs -f --tail 20 proef   # die letzten 20 Zeilen und weiter mitlesen
anna@web1:~$ sudo docker exec -it proef sh     # eine Shell im laufenden Container
# cat /etc/os-release
# exit
anna@web1:~$ sudo docker stop proef
anna@web1:~$ sudo docker start proef
anna@web1:~$ sudo docker rm -f proef           # stoppen und entfernen

docker logs ist die erste Stelle, an der Sie nachsehen, wenn ein Container nicht tut, was Sie erwarten, genau wie journalctl bei normalen Diensten (Lektion 6.2). Mit docker exec schauen Sie hinein, ändern dort aber besser nichts: Änderungen im Container verschwinden beim nächsten Update (Lektion 9.1).

Aufräumen

Images und gestoppte Container bleiben bestehen, bis Sie sie aufräumen. Auf einem VPS mit kleiner Festplatte summiert sich das unbemerkt.

anna@web1:~$ sudo docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          7         3         1.9GB     1.2GB (63%)
Containers      3         3         12MB      0B (0%)
Local Volumes   2         2         180MB     0B (0%)
Build Cache     0         0         0B        0B
anna@web1:~$ sudo docker image prune

docker image prune entfernt namenlose Images, die zu nichts mehr gehören; mit -a auch alle Images, die von keinem Container verwendet werden. Seien Sie vorsichtig mit docker system prune --volumes: Das entfernt auch anonyme Volumes (ohne Namen), die in diesem Moment zu keinem Container gehören, und docker volume prune -a sogar Volumes mit Namen. Darin können Ihre Daten liegen. Geben Sie Volumes deshalb immer einen Namen oder verwenden Sie einen Bind Mount (Lektion 9.1), und sehen Sie vorher mit docker volume ls nach.

Auch die Logs von Containern können wachsen. Docker speichert sie standardmäßig in JSON-Dateien ohne Größenbegrenzung. Eine Grenze legen Sie in /etc/docker/daemon.json fest:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Danach sudo systemctl restart docker; die Einstellung gilt nur für neu erstellte Container, bestehende Container erstellen Sie neu.

In der Praxis

Docker funktioniert auf einem VPS bei WebOké genauso wie bei jedem anderen Anbieter: Es ist Software innerhalb Ihres eigenen Servers, die Sie selbst installieren und aktualisieren. Prüfen Sie bei einem kleinen VPS mit docker system df und df -h (Lektion 1.4) regelmäßig den Speicherplatz.

Zusammenfassung

  • Installieren Sie Docker Engine aus der Paketquelle von Docker (mit eigenem Schlüssel und Signed-By) oder docker.io aus der Distribution, nicht beides.
  • Die Gruppe docker kommt root gleich; sudo docker hinterlässt eine Spur im sudo-Log. Rootless Mode ist eine sicherere, aber eingeschränktere Alternative.
  • docker run -d --name ... -p 127.0.0.1:host:container image:tag startet einen Container, der nur lokal erreichbar ist; prüfen Sie das mit ss.
  • docker ps, logs, exec, stop, rm sind Ihr tägliches Werkzeug.
  • Räumen Sie Images mit docker image prune auf, begrenzen Sie Container-Logs (standardmäßig unbegrenzt) und gehen Sie sparsam mit --volumes um.

Quiz

1. Warum verschafft die Mitgliedschaft in der Gruppe docker faktisch root-Rechte?



2. Nach docker run -d -p 8080:80 nginx zeigt ss -tlnp die Zeile 0.0.0.0:8080. Was hätten Sie eingeben müssen, um den Port nur lokal zu veröffentlichen?



3. Ein Container startet zwar, aber die Website darin funktioniert nicht. Was sehen Sie sich zuerst an?



4. Warum wählen Sie eine Quelle für Docker und installieren nicht docker.io und docker-ce gemischt?



5. Was macht docker system prune --volumes, das Sie genau wissen sollten?



Aufgabe

Aufgabe O9.2: Ihr erster Container. Installieren Sie Docker Engine laut dieser Lektion auf Ihrem Server (oder auf einem Testrechner). Starten Sie einen nginx-Container, der nur auf 127.0.0.1:8080 lauscht, prüfen Sie mit docker ps, curl -I und ss -tlnp, sehen Sie sich die Logs an und räumen Sie ihn danach auf. Beantworten Sie die Fragen: Aus welcher Quelle haben Sie Docker installiert, was hat ss bei Port 8080 angezeigt, und haben Sie sich selbst zur Gruppe docker hinzugefügt (warum oder warum nicht)?

Aufgabe O9.2: Ihr erster Container

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…