Einleitung und Zielsetzung
Docker ist eine Plattform zur Entwicklung, Bereitstellung und Ausführung von Anwendungen in sogenannten Containern. Container stellen Anwendungen einschließlich ihrer benötigten Bibliotheken, Laufzeitumgebungen und weiteren Abhängigkeiten in einer weitgehend isolierten Umgebung bereit.
Im Gegensatz zu klassischen virtuellen Maschinen benötigen Container kein eigenes Gastbetriebssystem mit separatem Kernel. Stattdessen nutzen sie den Kernel des Hostsystems. Die Isolation erfolgt unter Linux insbesondere durch Namespaces zur Trennung von Prozessen, Netzwerken und weiteren Systemressourcen sowie durch Control Groups (cgroups) zur Steuerung des Ressourcenverbrauchs.
Dieser Ansatz ermöglicht eine vergleichsweise ressourcenschonende Ausführung mehrerer Anwendungen auf einem gemeinsamen Host. Gleichzeitig lassen sich Anwendungen und ihre Abhängigkeiten weitgehend unabhängig voneinander verwalten, aktualisieren und bereitstellen.
Komponenten der Docker-Laufzeitumgebung
Für den Betrieb von Docker unter Linux werden mehrere Komponenten benötigt, die unterschiedliche Aufgaben übernehmen:
- Docker Engine: Zentrale Plattform zur Verwaltung und Ausführung von Containern
- Docker Daemon (
dockerd): Hintergrunddienst, der Docker-Objekte und Container verwaltet - Docker CLI (
docker): Kommandozeilenwerkzeug zur Kommunikation mit dem Docker-Daemon - containerd: Container-Laufzeitdienst, der unter anderem den Lebenszyklus von Containern verwaltet
- Docker Buildx: Erweiterung zum Erstellen von Container-Images mit BuildKit
- Docker Compose: Werkzeug zur Definition und Verwaltung zusammengehöriger Container-Anwendungen über YAML-Dateien
Docker Engine ist dabei nicht mit Docker Desktop gleichzusetzen. Docker Desktop ist eine zusätzliche Entwicklungsumgebung für Windows, macOS und Linux, die unter anderem eine grafische Benutzeroberfläche bereitstellt.
Auf einem Linux-Server wird üblicherweise Docker Engine direkt installiert und über die Kommandozeile verwaltet. Eine grafische Oberfläche ist dafür nicht erforderlich.
Ziel dieser Anleitung
Diese Anleitung beschreibt die Installation und grundlegende Einrichtung von Docker Engine auf einem Headless Debian-13-Server (Trixie) unter Verwendung des offiziellen Docker-Repositories.
Neben der eigentlichen Installation werden die benötigten Komponenten, die Einbindung der Paketquellen, die Integration in systemd sowie grundlegende Sicherheitsaspekte erläutert.
Abschließend wird die Funktionsfähigkeit der Docker-Laufzeitumgebung durch das Ausführen eines Testcontainers überprüft.
Als Ergebnis steht ein betriebsbereiter Docker-Host zur Verfügung, auf dem anschließend eigene Container und aus mehreren Diensten bestehende Anwendungen betrieben werden können.
Die weiterführende Verwaltung von Containern, Images, Netzwerken, Volumes und Docker-Compose-Projekten wird in separaten Artikeln behandelt.
Systemvoraussetzungen
Für die Installation von Docker Engine muss das Hostsystem bestimmte Anforderungen erfüllen. Neben einer unterstützten Linux-Distribution sind insbesondere die Prozessorarchitektur, administrative Berechtigungen und der Zugang zu den benötigten Paketquellen zu berücksichtigen.
Unterstütztes Betriebssystem
Docker Engine unterstützt die Debian-Versionen 12 (Bookworm) und 13 (Trixie). Als Prozessorarchitekturen werden unter anderem amd64 (x86-64), arm64, armhf und ppc64le unterstützt. Diese Anleitung verwendet Debian 13 (Trixie) auf einem x86-64-System.
Die installierte Betriebssystemversion überprüfen:
$ cat /etc/os-release
Die Kernelversion und die Prozessorarchitektur ermitteln:
$ uname -r
$ dpkg --print-architecture
- Betriebssystem: Debian GNU/Linux 13.7 (Trixie)
- Kernel: 6.12.113+deb13-amd64
- Architektur: amd64
- Hostname: docker-host-01
Docker verwendet zur Container-Isolation Funktionen des Linux-Kernels, insbesondere Namespaces und Control Groups (cgroups). Ein eigener Kernel innerhalb der Container ist daher nicht erforderlich.
Administrative Berechtigungen und Netzwerkzugang
Für die Installation werden Root-Berechtigungen beziehungsweise ein Benutzerkonto mit sudo-Berechtigung benötigt. Das Hostsystem muss außerdem die Debian-Paketquellen und das offizielle Docker-Repository unter download.docker.com erreichen können. Für den späteren Download von Container-Images ist zusätzlich der Zugriff auf entsprechende Container-Registries erforderlich, beispielsweise Docker Hub.
Vorbereitung der Paketverwaltung
Docker Engine wird in dieser Anleitung aus dem offiziellen Docker-Repository installiert. Damit APT die Pakete über eine verschlüsselte Verbindung herunterladen und ihre Authentizität überprüfen kann, werden zunächst die erforderlichen Werkzeuge installiert und der öffentliche Signaturschlüssel des Docker-Repositories hinterlegt.
Benötigte Pakete installieren
$ sudo apt install ca-certificates curl
ca-certificates stellt eine Sammlung vertrauenswürdiger Zertifizierungsstellen (Certificate Authorities, CA) bereit, die unter anderem zur Überprüfung von TLS-Zertifikaten bei HTTPS-Verbindungen verwendet wird.
curl ist ein Kommandozeilenwerkzeug zum Übertragen von Daten über verschiedene Netzwerkprotokolle. Es wird hier verwendet, um den öffentlichen Signaturschlüssel des Docker-Repositories herunterzuladen.
Verzeichnis für Signaturschlüssel vorbereiten
APT kann Signaturschlüssel für externe Paketquellen im Verzeichnis /etc/apt/keyrings verwalten. Das Verzeichnis wird bei Bedarf angelegt und mit den vorgesehenen Berechtigungen versehen:
$ sudo install -m 0755 -d /etc/apt/keyrings
Docker-Signaturschlüssel hinterlegen
Öffentliche Signaturschlüssel von Docker herunterladen:
$ sudo curl -fsSL https://download.docker.com/linux/debian/gpg \
-o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc
Der Schlüssel wird später über die Direktive Signed-By ausdrücklich dem Docker-Repository zugeordnet. Dadurch wird vermieden, dass er pauschal als vertrauenswürdig für sämtliche APT-Paketquellen gilt.
Offizielles Docker-Repository einrichten
Docker stellt ein eigenes APT-Repository bereit, über das Docker Engine und die zugehörigen Komponenten installiert und aktualisiert werden können. Für diese Anleitung wird das offizielle Docker-Repository verwendet.
Docker-Repository hinzufügen
/etc/apt/sources.list.d/docker.sources erstellen:
$ sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: trixie
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc
EOF
Die Datei definiert das offizielle Docker-Repository für Debian 13 (Trixie) auf der Architektur amd64. Über die Direktive Signed-By wird der zuvor hinterlegte Signaturschlüssel ausdrücklich dieser Paketquelle zugeordnet. APT verwendet ihn zur Überprüfung der Repository-Signaturen.
Paketlisten aktualisieren
$ sudo apt update
Bei erfolgreicher Einbindung erscheint das Docker-Repository in der Ausgabe:
Holen: https://download.docker.com/linux/debian trixie InRelease
Holen: https://download.docker.com/linux/debian trixie/stable amd64 Packages
Verfügbarkeit von Docker Engine überprüfen
Prüfen ob APT die Docker-Pakete aus dem offiziellen Repository beziehen kann:
$ apt-cache policy docker-ce
Die Ausgabe zeigt die verfügbaren Paketversionen, deren Herkunft und den vorgesehenen Installationskandidaten. Auf dem Testsystem wurde beispielsweise folgender Installationskandidat ermittelt:
docker-ce:
Installiert: (keine)
Installationskandidat: 5:29.9.1-1~debian.13~trixie
Damit ist das offizielle Docker-Repository erfolgreich eingebunden. Die Installation von Docker Engine kann anschließend über die reguläre APT-Paketverwaltung erfolgen.
Docker Engine und Komponenten installieren
Nachdem das offizielle Docker-Repository eingerichtet wurde, können Docker Engine und die zugehörigen Komponenten über die APT-Paketverwaltung installiert werden.
Installation der Docker-Pakete
$ sudo apt install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
Folgende Komponenten installiert:
docker-ce: Docker Engine einschließlich des Docker-Daemons (dockerd) zur Verwaltung von Images, Containern und Netzwerkendocker-ce-cli: Kommandozeilenwerkzeug (docker) zur Steuerung des Docker-Daemonscontainerd.io: Container-Laufzeitumgebung zur Verwaltung des Container-Lebenszyklusdocker-buildx-plugin: Erweiterung zum Erstellen von Container-Images mit BuildKitdocker-compose-plugin: Erweiterung zur Definition und Verwaltung von Anwendungen aus mehreren Containern
Automatischer Start der Docker-Dienste
Nach erfolgreicher Installation wird Docker unter Debian üblicherweise automatisch als systemd-Dienst gestartet und für den Systemstart aktiviert.
Der zentrale Dienst docker.service stellt den Docker-Daemon bereit. Dieser kommuniziert mit dem ebenfalls installierten Dienst containerd.service, der die Ausführung der Container unterstützt.
Die Verwaltung erfolgt über die Docker-CLI, die standardmäßig über den Unix-Socket /run/docker.sock mit dem Docker-Daemon kommuniziert.
Eine zusätzliche manuelle Konfiguration ist für den grundlegenden Betrieb zunächst nicht erforderlich.
Installation und Dienste überprüfen
Nach der Installation wird überprüft, ob Docker Engine ordnungsgemäß gestartet wurde und die benötigten Komponenten verfügbar sind.
Status der Docker-Dienste prüfen
$ sudo systemctl status docker
Bei erfolgreichem Start sollte die Ausgabe unter anderem folgende Informationen enthalten:
● docker.service - Docker Application Container Engine
Loaded: loaded (...; enabled; preset: enabled)
Active: active (running)
Main PID: 2974 (dockerd)
Zusätzlich kann der Status der Container-Laufzeitumgebung geprüft werden:
$ sudo systemctl status containerd
Auch dieser Dienst sollte den Status active (running) und enabled aufweisen.
Docker-Protokolle überprüfen
Sollte der Docker-Dienst nicht ordnungsgemäß starten oder Fehler melden, können seine Protokolle über das systemd-Journal eingesehen werden:
$ sudo journalctl -u docker -b --no-pager
Entscheidend für die erfolgreiche Initialisierung sind unter anderem folgende Protokolleinträge:
Completed buildkit initialization
Daemon has completed initialization
API listen on /run/docker.sock
Grundlegende Sicherheitseinstellungen
Benutzerberechtigungen und Docker-Socket
Gruppenmitgliedschaften des Benutzers anzeigen:
$ id <Benutzer>
Berechtigungen des Docker-Sockets anzeigen:
$ ls -l /run/docker.sock
srw-rw---- 1 root docker 0 18. Okt 15:10 /run/docker.sock
Funktionstest
Nach erfolgreicher Installation und Überprüfung des Docker-Dienstes wird die Funktionsfähigkeit der Laufzeitumgebung durch das Ausführen eines Testcontainers überprüft.
Testcontainer ausführen
Docker stellt mit hello-world ein einfaches Test-Image bereit, das die grundlegende Kommunikation zwischen Docker-CLI, Docker-Daemon und Container-Laufzeitumgebung überprüft.
Der Testcontainer wird mit folgendem Befehl gestartet:
$ sudo docker run hello-world
Ist das Image lokal noch nicht vorhanden, wird es automatisch von Docker Hub heruntergeladen. Anschließend erstellt Docker daraus einen Container, führt das enthaltene Programm aus und gibt unter Anderem eine Bestätigung aus:
Hello from Docker!
This message shows that your installation appears to be working correctly.
Nach der Ausgabe beendet sich der Container automatisch.
Containerstatus überprüfen
Mit folgendem Befehl werden die aktuell laufenden Container angezeigt:
$ sudo docker ps
Da der hello-world-Container sein Programm bereits beendet hat, erscheint er nicht in dieser Übersicht. Um auch beendete Container anzuzeigen, wird die Option -a verwendet:
$ sudo docker ps -a
Beispielausgabe:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
941d4cd8521d hello-world "/hello" 37 seconds ago Exited (0) 36 seconds ago hungry_mclean
Heruntergeladenes Image überprüfen
Die lokal vorhandenen Container-Images werden mit folgendem Befehl angezeigt:
$ sudo docker image ls
Beispielausgabe:
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
hello-world:latest 11a3eb1597e8 25.9kB 9.49kB U
Abschluss und Aktualisierung
Die Installation der Docker Engine unter Debian 13 ist abgeschlossen. Docker wird als systemd-Dienst betrieben und beim Systemstart automatisch gestartet. Die Laufzeitumgebung umfasst Docker Engine, containerd sowie die Erweiterungen Docker Buildx und Docker Compose.
Aktualisierung der Docker-Komponenten
Da Docker Engine über das offizielle APT-Repository installiert wurde, können verfügbare Updates über die reguläre Paketverwaltung eingespielt werden:
$ sudo apt update
$ sudo apt upgrade
Dabei werden neben Docker gegebenenfalls auch andere installierte Systempakete aktualisiert.
Aktualisierung der Docker-Images
Die Aktualisierung eines Images erfolgt durch erneutes Herunterladen aus der jeweiligen Container-Registry. Am Beispiel des zuvor verwendeten hello-world-Images:
$ sudo docker pull hello-world:latest
Docker prüft, ob die aktuelle Version des Images bereits lokal vorhanden ist. Falls eine neuere Version verfügbar ist, werden die erforderlichen Image-Daten heruntergeladen. Andernfalls meldet Docker, dass das Image bereits aktuell ist.
Mit folgendem Befehl kann das heruntergeladene Image angezeigt werden:
$ sudo docker image ls
Wichtig: Die Aktualisierung eines Images verändert keine bereits vorhandenen Container. Diese verwenden weiterhin das Image, aus dem sie ursprünglich erstellt wurden. Um eine aktualisierte Image-Version zu verwenden, muss ein neuer Container erstellt werden.
Beim Testcontainer hello-world genügt dazu die erneute Ausführung:
$ sudo docker run hello-world
Dabei wird ein neuer Container aus dem lokal vorhandenen Image erstellt und ausgeführt. Bereits vorhandene Container bleiben unverändert bestehen.
Bei dauerhaft betriebenen Anwendungen erfolgt die Aktualisierung üblicherweise durch das kontrollierte Neuerstellen der Container, beispielsweise mithilfe von Docker Compose. Die Aktualisierung solcher Anwendungen sowie der Umgang mit persistenten Daten werden in separaten Artikeln behandelt.
Befehlszeilenreferenz
Die folgenden Kommandos dienen zur Überprüfung der Docker-Installation sowie zur grundlegenden Verwaltung von Images und Containern.
Docker Engine und Dienste
| Kommando | Funktion |
|---|---|
sudo systemctl status docker | Status des Docker-Daemons anzeigen |
sudo systemctl start docker | Docker-Daemon starten |
sudo systemctl stop docker | Docker-Daemon stoppen |
sudo systemctl restart docker | Docker-Daemon neu starten |
sudo journalctl -u docker -b | Docker-Dienstprotokolle anzeigen |
sudo docker version | Installierte Docker-Versionen anzeigen |
Images und Container
| Kommando | Funktion |
|---|---|
sudo docker run hello-world | Testcontainer erstellen und ausführen |
sudo docker ps | Laufende Container anzeigen |
sudo docker ps -a | Alle Container einschließlich beendeter anzeigen |
sudo docker image ls | Lokal gespeicherte Images anzeigen |
sudo docker pull hello-world:latest | Image herunterladen bzw. aktualisieren |
sudo docker start <Container> | Vorhandenen Container starten |
sudo docker stop <Container> | Laufenden Container stoppen |
sudo docker rm <Container> | Gestoppten Container entfernen |
Die Platzhalter <Container> sind durch den jeweiligen Containernamen oder die Container-ID zu ersetzen.
Beispiel:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e37ade7c0ee2 hello-world "/hello" 15 seconds ago Exited (0) 14 seconds ago elated_wiles
$ sudo docker start elated_wiles
$ sudo docker start e37ade7c0ee2
![]()