Mit Docker lassen sich Serveranwendungen sicher in isolierten Containern betreiben. Beeinträchtigungen des installierten Linux sind damit ausgeschlossen und auch Testinstallationen lassen sich gefahrlos durchführen.
Linux-Nutzer haben bei der Softwareinstallation mehrere Möglichkeiten. Die klassische Methode führt über den Paketmanager der Distribution. Dabei werden Programme direkt im Dateisystem als ausführbare Dateien installiert. Man kann außerdem über Virtualisierungssoftware wie Virtualbox Programme unabhängig vom installierten Betriebssystem in einem abgeschotteten Bereich nutzen. Dafür ist jedoch ein komplettes Gastbetriebssystem erforderlich, das viel Platz auf der Festplatte beansprucht und die Leistung der Hardware nicht vollständig nutzen kann.
In diesem Artikel geht es um Docker, ein weiteres Containerformat. Die Software ist vor allem für Serveranwendungen gedacht, es lassen sich über Umwege aber auch Programme mit grafischer Oberfläche starten.
Service: Befehlszeilen und Beispieldateien zu diesem Artikel können Sie über https://m6u.de/DOCK abrufen.
Wie Docker-Container funktionieren
Docker stellt eine Umgebung für die Installation von Programmen und deren Abhängigkeiten bereit. Die Basis bildet ein Ordner, in dem die Dateien für ein minimales Linux-System liegen – im Docker-Sprachgebrauch wird es als „Image“ bezeichnet. Man kann in Docker Ubuntu oder ein anderes Linux-System verwenden. Es kann auch neuer sein als das installierte System. Das Image ist schreibgeschützt und dient als Vorlage für Container, in denen sich die gewünschte Software installieren lässt.
Ein Container lässt sich interaktiv nutzen, ähnlich wie eine chroot-Umgebung. Man kann darin über apt Software installieren und die Konfiguration anpassen. In der Regel wird man jedoch über ssh auf das System im Container zugreifen. Das System im Docker-Container verwendet den Kernel des installierten Linux. Im Vergleich zu Virtualisierungssoftware entfällt daher die Virtualisierung der Hardware, was die Leistung verbessert. Stattdessen virtualisiert Docker gewissermaßen die Software, also alle Komponenten, die eine Anwendung benötigt.
Die Vorteile von Docker: Docker-Container bieten eine isolierte Umgebung für die Ausführung von Anwendungen. Jeder Container hat seine eigene Dateisystemebene und Prozessisolierung, was bedeutet, dass Änderungen, die in einem Container vorgenommen werden, den Host oder andere Container nicht beeinträchtigen. Docker eignet sich daher sehr gut zum Ausprobieren von Anwendungen, ohne dass man dafür auf dem Hostsystem zahlreiche Programmpakete installieren muss. Der produktive Einsatz ist aufgrund der Isolation sicherer als bei herkömmlich installierter Software.

Docker unter Ubuntu/Mint installieren
Docker ist in den Paketquellen populärer Linux-Distributionen enthalten. In Ubuntu 22.04 und seinen Varianten heißt das DEB-Paket „docker.io“. Auch wenn die Einrichtung über das Paketmanagement einfacher ist, empfehlen wir die manuelle Installation der aktuellsten Version, die wir in diesem Artikel für Ubuntu 22.04/Linux Mint 21 und verwandte Distributionen beschreiben. Docker befindet sich in stetiger Entwicklung und einige Zusatz- oder Verwaltungsprogramme erfordern neuere Versionen, als sie im Ubuntu-Repository bereitstehen.
Docker läuft standardmäßig als Systemdienst mit root-Recht, kann aber sicherer auch ohne erhöhte Privilegien genutzt werden. Zur Installation öffnen Sie ein Terminalfenster und führen die folgenden vier Befehle aus:
sudo apt update
sudo apt install curl dbus-user-session uidmap
curl -fsSL https://get.docker.com/rootless | sh
sudo loginctl enable-linger $(whoami)
Öffnen Sie über den Dateimanager die versteckte Datei „.bashrc“ (einblenden mit Strg-H) in einem Editor. Fügen Sie dort am Ende diese Zeile
export DOCKER_HOST=unix:///run/user/1000/docker.sock
hinzu. Diese Angabe wird von einigen Anwendungen benötigt. Speichern und schließen Sie die Datei.
Die ausführbaren Dateien werden im Home-Verzeichnis im Ordner „bin“ installiert. Damit dieser sich im Suchpfad befindet, muss die Profilkonfiguration neu eingelesen werden:
source ~/.profile
Die geänderte Datei „.bashrc“ wird damit ebenfalls neu eingelesen.
Damit Docker ohne root-Privilegien Netzwerkports unterhalb von 1024 verwenden kann, muss die Konfiguration mit diesen zwei Befehlen angepasst werden:
sudo setcap cap_net_bind_service=ep $(which rootlesskit)
systemctl --user restart docker
Hinweis: Wer Docker traditionell mit root-Recht verwenden will, entfernt bei der Installation in der curl-Zeile einfach die Pfad-angabe „rootless“.

Erste Versuche mit Docker
Als ersten Test erstellen und starten Sie einen Container mit Bash in einem virtuellen Ubuntu:
docker run -t -i --rm ubuntu bash
Der Parameter „–rm“ sorgt für einen temporären Container für Testzwecke, alle Änderungen darin gehen beim Beenden der Shell verloren. „-t“ emuliert ein Terminal für bash und „-i“ ermöglicht dessen interaktive Nutzung. Docker lädt automatisch ein minimales Image von Ubuntu herunter (zur Zeit etwa 80 MB) und startet die Bash-Shell in der isolierten Umgebung. Mit
exit
beenden Sie die Shell und schließen den Container.
Wenn Sie ein anderes System nutzen wollen, ersetzen Sie „ubuntu“ beispielsweise durch „debian“ oder „fedora“. Eine durchsuchbare Datenbank mit allen verfügbaren Systemen und Anwendungen gibt es unter https://hub.docker.com.
Viele Images enthalten bereits Software, so etwa die Datenbank My SQL oder das Content-Management-System WordPress. Meist benötigen diese eine spezielle Konfiguration oder arbeiten mit anderen Images zusammen.
Container anpassen und Image erstellen
In der Regel lässt man die Imagedatei, auf der ein Container basiert, unberührt. Benötigt man aber bestimmte Programme immer wieder in weiteren Containern, kann man das Image anpassen. Nutzen Sie dazu folgenden Befehl:
docker run -t -i ubuntu bash
Sie befinden sich in der Shell des Containers. Der Prompt zeigt hinter „root@“ den Hostnamen an, der zugleich die ID des Containers ist. Führen Sie den Befehl
apt update && apt install -y mc
aus, um als Beispiel den Dateimanager Midnight Commander zu installieren. Verlassen Sie die Shell dann mit exit. Diesen Container können Sie jetzt mit dem Image verschmelzen. Geben Sie zuerst den Befehl
docker ps -l
ein, der den gerade neu angelegten Container mit dem Midnight Commander auflistet. In der Liste finden Sie die Container-ID auf der linken Seite. Lautet diese ID beispielsweise „17145a42596e“, dann sichern Sie mit dem Kommando
docker commit 17145a42596e ubuntu-mit-mc
den Container-Zustand dauerhaft in einem Image mit dem Namen „ubuntu-mit-mc“. Wenn Sie daraus mit
docker run -i -t ubuntu-mit-mc bash
einen neuen Container erstellen, dann können Sie mit dem Befehl mc den dort installierten Midnight Commander im virtuellen Ubuntu starten. Mit exit verlassen Sie den Container. Der Befehl
docker images
zeigt jetzt neben dem zuerst erstellen Image „ubuntu“ auch „ubuntu-mit-mc“ an. Um einen Container auf der Basis des neuen Images zu erstellen, verwenden Sie mit
docker run -t -i ubuntu-mit-mc bash
den bereits bekannten Befehl.

Docker-Container verwalten
Welche Container aktuell laufen, erfahren Sie so:
docker ps
Wenn Sie einen interaktiven Container („run -i“) mit exit verlassen, wird er gestoppt. Mit
docker -a
erhalten Sie eine Übersicht mit allen vorhandenen Containern. In der Ausgabe sehen Sie auch die inaktiven Container und deren IDs. Mit
docker start [Container-ID]
starten Sie einen Container wieder und mit
docker attach [Container-ID]
reaktivieren Sie – wenn vorhanden – die interaktive Verbindung zur Shell.

Docker kennt noch sehr viele weitere Befehle. Eine Übersicht erhalten Sie, indem Sie das Tool ohne Parameter aufrufen. Eine Hilfe zu den Unteroptionen beispielsweise für den Befehl „run“ liefert diese Syntax:
docker run --help
Wichtig ist noch der Befehl „rm“, mit dem Sie Container löschen, oder „rmi“ zum Löschen von Images – jeweils gefolgt von der gewünschten Container-ID beziehungsweise Image-ID.
Docker über den Browser verwalten
Für einfache Aufgaben reichen die Docker-Befehle im Terminal aus. Sobald man jedoch mehrere Images und Container für Webanwendungen einrichten möchte, verwendet man besser eine grafische Oberfläche. Dafür empfiehlt sich die Docker-Verwaltung Portainer (www.portainer.io), die selbst über Docker installiert wird. Dafür verwenden Sie diesen Terminalbefehl:
docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /$XDG_RUNTIME_DIR/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Anschließend rufen Sie die Adresse https://localhost:9443 im Browser auf. Da Portainer ein selbst signiertes Zertifikat verwendet, erhalten Sie eine Warnung. In Firefox klicken Sie auf „Erweitert“ und dann auf „Risiko akzeptieren und fortfahren“. Geben Sie Benutzername und Passwort für den administrativen Benutzer ein, klicken Sie auf „Create user“, dann auf „Get started“ und anschließend auf „Live connect“.

Im Menü auf der linken Seite des Fensters sehen Sie nach einem Klick auf „Images“ die bisher erstellten Docker-Images. Bei nicht mehr benötigten Images können Sie ein Häkchen setzen und auf „Remove“ klicken. Gehen Sie auf „Containers“. Hier werden die Container angezeigt, die Spalte „State“ enthält „exited“ bei gestoppten Containern, andernfalls „running“. Sie können Container markieren und starten. In der Spalte „Quick Actions“ lässt sich über das Icon „Exec Console“ (zweites von rechts) nach einem Klick auf „Connect“ ein Terminal im Browser aufrufen.
Um die Konfiguration eines Containers zu ändern, klicken Sie ihn in der Spalte „Name“ an. Sie können beispielsweise hinter „Restart policies“ den Wert „Allways“ wählen und auf „Update“ klicken. Der Container wird dann nach einem Linux-Neustart automatisch aktiviert.
Anwendungen über Portainer einrichten
Nach einem Klick auf „Add Templates“ kann man in Portainer nach Anwendungen suchen und diese auch gleich installieren. Das ist empfehlenswert, wenn die Standardkonfiguration ausreicht. Wir schlagen jedoch vor, den Weg über „Add Templates –› Custom Templates“ zu gehen, weil sich damit die Konfiguration individuell anpassen lässt.
Als erstes Beispiel haben wir Nginx Proxy Manager (https://nginxproxymanager.com) vorbereitet. Damit können Sie den Port von Docker-Webanwendungen dem lokalen Hostnamen oder eine über das Internet erreichbare Domain zuordnen. Danach erfolgt die Installation von WordPress.
Schritt 1: Klicken Sie auf „Add Custom Template“. Für den Nginx Proxy Manager tragen Sie in die Felder hinter „Title“ und „Description“ jeweils npm ein.
Schritt 2: Gehen Sie auf https://m6u.de/DOCK, klicken Sie auf „NPM-Dockerfile“ und dann auf der rechten Seite auf „Copy raw file“ (das Icon hinter „Raw“).
Schritt 3: Zurück in Portainer fügen Sie den Inhalt mit Strg-V in den Eingabebereich unter „Web editor“ ein. Die Konfiguration enthält Definitionen für das Docker-Netzwerk „npm“, über das Nginx Proxy Manager später auf Anwendungen in anderen Containern zugreifen kann.
Schritt 4: Klicken Sie unter „Custom Templates“ auf „npm“ und danach auf „Deploy the stack“.
Als Nächstes richten Sie WordPress ein. Gehen Sie so vor, wie für den Nginx Proxy Manager beschrieben. Die Konfigurationsdatei finden Sie über https://m6u.de/DOCK unter dem Namen „Wordpress-Dockerfile“. Die Konfiguration enthält die Anmeldedaten für die My-SQL-Datenbank, die Sie bei Bedarf ändern. Auf hohe Sicherheit muss man hier keinen Wert legen, weil der Datenbankserver nicht von außen erreichbar ist.
Hinweis: Wenn Sie WordPress ohne Nginx Proxy Manager verwenden wollen, entfernen Sie alle Einträge für „npm“ aus der Konfiguration.
Nach Abschluss der Installation sehen Sie unter „Images“ drei neue Einträge mit den Tags „mysql:5.7“, „wordpress:latest“ und „jc21/nginx-proxy-manager:latest“. Unter „Containers“ sind die drei Container „Nginx_Proxy_Manager“, „mysql“ und „wordpress“ hinzugekommen. In der Spalte „Published Ports“ zeigt Portainer, auf welchen Ports die Serveranwendungen lauschen.
Nginx Proxy Manager konfigurieren: Rufen Sie WordPress testweise mit http://localhost:[Port] auf. Für den Platzhalter „[Port]“ setzen Sie die angezeigte Portnummer ein. Statt „localhost“ können Sie auch den Namen des Rechners oder seine IP-Nummer verwenden.

Führen Sie die WordPress-Konfiguration aber jetzt noch nicht durch, weil sich das CMS danach nur noch mit dieser URL nutzen lässt. Öffnen Sie vorher http://localhost:81 im Browser und melden Sie sich mit der E-Mail-Adresse „admin@example.com“ und dem Passwort „changeme“ an. Danach öffnet sich ein Fenster, in das Sie den gewünschten Benutzernamen und eine E-Mail-Adresse eintragen. Nach einem Klick auf „Save“ legen Sie ein neues Passwort fest.
Gehen Sie auf „Hosts –› Proxy Hosts“ und klicken Sie auf „Add Proxy Host“. Unter „Domain Names“ tragen Sie den Namen des Rechners ein und bestätigen mit der Eingabetaste. Alternativ verwenden Sie die IP-Adresse Ihres Linux-PCs oder eine für das heimische Netzwerk konfigurierte Domain für dynamisches IP (siehe www.pcwelt.de/1150123). Unter „Forward Hostname / IP“ tragen Sie die IP-Adresse Ihres Linux-PCs ein und unter „Forward Port“ den Port des WordPress-Docker-Containers. Anschließend klicken Sie auf „Save“. Im Browser lässt sich WordPress jetzt über den konfigurierten Host- oder Domainnamen ohne zusätzliche Portangabe aufrufen und konfigurieren.
Achtung: Jeder Docker-Container verwendet einen zufälligen Netzwerkport. Er ändert sich, wenn Sie den WordPress-Container neu erstellen. In diesem Fall passen Sie den Port im Nginx Proxy Manager an.
Zusätzliche Info: Firefox im Docker starten
Für Anwendungen mit grafischer Oberfläche ist Docker nicht entwickelt worden. Prinzipiell ist es möglich, Programme in einem Docker-Container über SSH zu starten, was aber eine Weiterleitung per X11-Forward und einen Xorg-Server auf dem PC erfordern würde. Da Ubuntu und einige andere Distribution inzwischen Wayland statt X11 verwendet, funktioniert das dort nicht mehr. Als Alternative kann man x11vnc und xvfb im Docker-Container verwenden und dann über einen VNC-Client wie Remmina eine Verbindung aufbauen.
Die Beispieldateien für Firefox in einem Docker-Container finden Sie über https://m6u.de/DOCK. Klicken Sie auf „Firefox-Docker.tar.gz“ und dann auf „Raw“. Entpacken Sie das Archiv im Downloadverzeichnis und öffnen Sie den Ordner im Terminal. Dann starten Sie mit
./1_Build_Docker_Firefox.sh
und anschließend
./2_Run_Docker_Firefox.sh
zwei Shell-Scripts. Das erste erstellt das Image „firefox“, installiert darin die nötigen Pakete, stellt die deutsche Sprachunterstützung ein und erstellt das Benutzerkonto „docker_user“. Außerdem wird das Passwort für den VNC-Server auf „1234“ festgelegt. Das zweite Script erstellt und aktiviert den Container. Konfigurieren Sie in Remmina eine Verbindung mit dem Protokoll „Remmina-VNC-Plugin“ zu „localhost“ und dem Passwort „1234“. Im Fenster startet die grafische Oberfläche Fluxbox. Per rechtem Mausklick auf den Desktop rufen Sie ein kleines Menü auf, über das Sie Firefox starten können.

