Modul 9 · 9.2
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:
- Die Paketquelle von Docker selbst (
download.docker.com). Immer die neueste Version, einschließlich des Plug-insdocker compose, das Sie in Lektion 9.3 verwenden. Das beschreibt die Docker-Dokumentation, und das verwendet dieser Kurs. - Das Paket
docker.iovon 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, obdocker 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.ascDanach 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.ascBei 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 annaTun 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 /hostund 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:
| Teil | Bedeutung |
|---|---|
-d | Im Hintergrund laufen (detached) |
--name proef | Ein Name, damit Sie nicht mit langen IDs arbeiten müssen |
-p 127.0.0.1:8080:80 | Port 80 im Container wird Port 8080 auf dem Host, nur auf Loopback |
nginx:stable | Das 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 entfernendocker 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 prunedocker 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) oderdocker.ioaus der Distribution, nicht beides. - Die Gruppe docker kommt root gleich;
sudo dockerhinterlä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:tagstartet einen Container, der nur lokal erreichbar ist; prüfen Sie das mitss.docker ps,logs,exec,stop,rmsind Ihr tägliches Werkzeug.- Räumen Sie Images mit
docker image pruneauf, begrenzen Sie Container-Logs (standardmäßig unbegrenzt) und gehen Sie sparsam mit--volumesum.
Quiz
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.
Aus der Quelle von Docker aktualisiert unattended-upgrades ihn standardmäßig nicht; docker.io aus der Distribution schon. ss sollte 127.0.0.1:8080 anzeigen, nicht 0.0.0.0:8080. Die Gruppe docker verleiht root-Rechte; mit sudo docker bleibt jeder Befehl im sudo-Log.
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
- Docker-Dokumentation, Install Docker Engine on Debian: https://docs.docker.com/engine/install/debian/
- Docker-Dokumentation, Install Docker Engine on Ubuntu: https://docs.docker.com/engine/install/ubuntu/
- Docker-Dokumentation, Linux post-installation steps: https://docs.docker.com/engine/install/linux-postinstall/
- Docker-Dokumentation, Docker security (Docker daemon attack surface): https://docs.docker.com/engine/security/
- Docker-Dokumentation, Rootless mode: https://docs.docker.com/engine/security/rootless/
- Docker-Dokumentation, JSON File logging driver: https://docs.docker.com/engine/logging/drivers/json-file/
- VPS: vom ersten Login zum sicheren Server 6.1: Docker aus der offiziellen Quelle installieren
