SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-09-04

Docker auf Rocky Linux und AlmaLinux installieren

Installieren Sie Docker Engine mit dnf und dem Compose-Plugin. Beheben Sie danach den EL-Sonderfall, dass Podman docker belegt, sowie SELinux-Probleme bei Bind-Mounts.

Docker auf Rocky Linux und AlmaLinux installieren

Um Docker auf Rocky Linux oder AlmaLinux zu installieren, fügen Sie das eigene dnf-Repository von Docker hinzu, installieren die Engine mit dem Compose-Plugin und aktivieren anschließend den Dienst. Dafür sind vier Befehle erforderlich. Das Vorgehen ist bei beiden Distributionen identisch, da beide RHEL-Neuimplementierungen (Red Hat Enterprise Linux) sind und dasselbe Paketlayout verwenden. CentOS Stream funktioniert auf dieselbe Weise. Die folgenden Schritte gelten für beide Distributionen. Wenn Sie noch zwischen ihnen wählen, sind die entscheidenden Faktoren das Kompatibilitätsversprechen des jeweiligen Projekts und die Unterstützung Ihrer älteren CPU.

Die Installation ist kurz. Der größte Teil dieser Anleitung behandelt daher die Unterschiede von Enterprise Linux (EL) gegenüber Ubuntu. Podman verwendet möglicherweise bereits den Befehl docker auf Ihrem Image. SELinux blockiert Dateien aus Bind-Mounts, bis diese das richtige Label tragen. Firewalld filtert von Docker veröffentlichte Ports nicht. Deshalb kann ein Container-Port aus dem Internet erreichbar sein, während firewall-cmd meldet, dass kein Port geöffnet ist.

Verwenden Sie nicht das Komfortskript von Docker aus get.docker.com. Die Docker-Dokumentation weist darauf hin, dass es für den Produktionseinsatz nicht empfohlen wird. Das Skript überschreibt Ihre Repository-Konfiguration ohne Rückfrage und kann nicht sicher erneut ausgeführt werden, um ein Upgrade durchzuführen. Wenn Sie das Repository manuell hinzufügen, behandelt dnf upgrade Docker wie jedes andere Paket auf dem System. Dadurch fällt die Engine auch in den Zuständigkeitsbereich von dnf-automatic, sofern dieses Tool bei Ihnen Sicherheitsupdates zeitgesteuert installiert. Entscheiden Sie daher frühzeitig, ob Docker unbeaufsichtigt aktualisiert oder bis zu einem Wartungsfenster zurückgehalten werden soll. In beiden Fällen ersetzt ein Upgrade die installierte Binärdatei, während der alte dockerd weiterläuft. needs-restarting zeigt Ihnen, welche Dienste noch den gerade ersetzten Code ausführen.

Antwortet podman bereits auf den Befehl docker?

Rocky Linux und AlmaLinux liefern podman in ihren Standard-Repositorys aus. Viele VPS-Images installieren es bereits für Sie. Einige Images gehen noch weiter und installieren podman-docker. Dadurch wird unter /usr/bin/docker ein Shell-Skript abgelegt, das podman aufruft. Jeder von Ihnen eingegebene docker-Befehl führt dann stattdessen podman aus. Eine Anleitung für Docker erzeugt dadurch möglicherweise unerwartete Ausgaben.

Der erste Hinweis ist ein Banner. Das Skript /usr/bin/docker prüft, ob die Datei /etc/containers/nodocker vorhanden ist. Fehlt diese Datei, gibt es vor jedem weiteren Vorgang eine Zeile aus:

Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.

Jemand könnte diese Datei angelegt haben, um das Banner zu unterdrücken. Verlassen Sie sich daher nicht allein darauf. Fragen Sie die Paketdatenbank, welches Paket die Binärdatei bereitstellt:

command -v docker
rpm -qf "$(command -v docker)"

Beginnt die Antwort mit podman-docker, antwortet podman. Beginnt sie mit docker-ce-cli, handelt es sich um echtes Docker. Meldet rpm -qf, dass kein Paket die Datei besitzt, wurde sie manuell installiert. Lesen Sie das Skript, bevor Sie ihm vertrauen.

Podman verwendet dieselben OCI-Images und ist eine sinnvolle Wahl. Wenn Sie podman verwenden möchten, können Sie hier aufhören. Beide sind Linux-Container-Engines. Wenn die Entscheidung für eine Plattform noch offen ist, sollten Sie wissen, dass FreeBSD Jails eine vollständige Userland-Umgebung isolieren, statt aus einer Registry abgerufene geschichtete Images auszuführen. Wenn Sie Docker Engine verwenden möchten, entfernen Sie zuerst die in Konflikt stehenden Pakete. Dies ist die von Docker für RHEL dokumentierte Liste:

sudo dnf remove docker docker-client docker-client-latest docker-common \
  docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc

Lesen Sie, welche Pakete dnf zusammen mit diesen Paketen entfernen möchte, bevor Sie den Vorgang bestätigen. Bei einem frischen VPS-Image ist die Liste kurz. Auf einem System, das bereits verwendet wurde, kann das Entfernen von podman auch cockpit-podman oder ein anderes davon abhängiges Werkzeug entfernen.

Grundsätzlich können podman und Docker gemeinsam installiert sein. Entfernen Sie dafür nur podman-docker, damit der Name docker frei wird, sowie runc, den das Paket containerd.io ersetzt. In der Docker-Dokumentation wird podman als in Konflikt stehendes Paket behandelt. Diese Konfiguration wird von Docker daher nicht unterstützt. Wenn die Installation weiterhin einen Konflikt meldet, verwenden Sie die vollständige Entfernungsliste oben.

Docker-Repository mit dnf config-manager hinzufügen

Docker veröffentlicht RPMs für Enterprise Linux unter download.docker.com. Die Repository-Datei verweist auf den CentOS-Tree, gegen den Rocky Linux und AlmaLinux auflösen. Ein Rocky-System auf ein CentOS-Repository zu verweisen, wirkt zunächst wie ein Fehler. Das ändert sich, wenn bekannt ist, wie beide Distributionen aus der CentOS-Linie hervorgegangen sind, nachdem Red Hat CentOS 2020 in Stream umgewandelt hatte. Im August 2026 dokumentiert Docker dieses Repository für CentOS Stream 9 und CentOS Stream 10.

sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

Version 5 von dnf hat das Argument --add-repo entfernt. Daher schlägt der zweite Befehl bei neueren Releases fehl. Prüfen Sie zunächst, welche Version installiert ist, und verwenden Sie dann die passende Form:

dnf --version

Wenn eine 5.x-Version ausgegeben wird, verwenden Sie stattdessen die Subcommand-Form:

sudo dnf config-manager addrepo --from-repofile=https://download.docker.com/linux/centos/docker-ce.repo

Beide Befehle schreiben dieselbe Datei nach /etc/yum.repos.d/docker-ce.repo. Die falsche Form schlägt mit einem Fehler wegen eines unbekannten Arguments fehl. Es tritt also kein stiller Fehler auf.

Die Repository-Datei setzt baseurl auf einen Pfad, der $releasever enthält. dnf erweitert diese Variable anhand Ihres Release-Pakets. Rocky Linux und AlmaLinux setzen sie auf die Major-Version. Daher ist 9 unter EL 9 und 10 unter EL 10 gesetzt. Deshalb wird ein CentOS-Repository auf einem Rocky-System korrekt aufgelöst. Prüfen Sie die Erweiterung vor der Installation:

sudo dnf repoinfo docker-ce-stable

Lesen Sie die Zeile Repo-baseurl. Sie sollte mit /9/x86_64/stable oder /10/x86_64/stable enden. Wenn Ihr Release $releasever auf eine Punktversion wie 9.6 setzt, meldet dnf für diese URL beim Abruf der Metadaten Status code: 404. Beheben Sie das Problem, indem Sie /etc/yum.repos.d/docker-ce.repo bearbeiten und $releasever durch die reine Major-Nummer ersetzen.

Installieren Sie die Engine und das Compose-Plugin

sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Fünf Pakete, und jedes übernimmt eine Aufgabe. docker-ce ist der Daemon, dockerd. docker-ce-cli ist der Befehl docker, den Sie eingeben. containerd.io ist die Container-Laufzeitumgebung, die der Daemon steuert. docker-buildx-plugin erstellt Images. docker-compose-plugin stellt docker compose als Subcommand bereit.

Diese Pakete installieren keine Binärdatei namens docker-compose mit Bindestrich. Das war Compose v1, dessen Lebensdauer im Juli 2023 endete. Alles, was docker-compose mit einem Bindestrich aufruft, muss auf docker compose mit einem Leerzeichen aktualisiert werden.

Die erste Installation hält an, um den Signaturschlüssel von Docker zu importieren, und zeigt dessen Fingerabdruck an. Der Schlüssel stammt aus gpgkey=https://download.docker.com/linux/centos/gpg in der Repository-Datei, die Sie gerade hinzugefügt haben. Vergleichen Sie daher den von dnf ausgegebenen Fingerabdruck mit dieser URL, bevor Sie den Schlüssel akzeptieren.

Ein Fehler tritt so häufig auf, dass er ausdrücklich erwähnt werden sollte. Wenn dnf meldet, dass containerd.io container-selinux benötigt und kein Paket diese Abhängigkeit bereitstellt, ist Ihr AppStream-Repository deaktiviert. Führen Sie dnf repolist aus und bestätigen Sie, dass appstream aufgeführt ist, weil container-selinux dort für EL 9 und EL 10 bereitgestellt wird.

Docker starten und die Ausführung bestätigen

sudo systemctl enable --now docker
sudo systemctl status docker --no-pager
sudo docker run --rm hello-world

Die Docker-RPM-Pakete lassen den Daemon nach der Installation gestoppt und deaktiviert. Deshalb erscheint dieser Schritt auf der Docker-CentOS-Seite, nicht jedoch auf der Ubuntu-Seite, auf der das deb-Paket den Dienst für Sie startet. Wenn Sie enable überspringen, läuft Docker bis zum nächsten Reboot. Danach bleibt der Dienst beendet und stoppt dadurch alle Container.

systemctl status sollte Active: active (running) anzeigen. Der Container hello-world sollte This message shows that your installation appears to be working correctly. ausgeben und beendet werden. Gibt er stattdessen einen Berechtigungsfehler für /var/run/docker.sock aus, fehlt sudo. Das wird im folgenden Abschnitt zur docker-Gruppe behoben.

Prüfen Sie das Compose-Plugin separat. Es ist ein eigenes Paket und kann fehlen, obwohl die Engine ordnungsgemäß funktioniert:

docker compose version

Eine erfolgreiche Ausgabe sieht wie Docker Compose version v2.x.x aus. Das Wiederherstellen Ihrer Dienste nach einem Reboot ist eine andere Frage als das Aktivieren des Daemons. Restart-Richtlinien bestimmen, ob Compose-Dienste beim Booten wieder starten.

Warum führt ein Bind-Mount zu „Permission denied“?

Rocky Linux und AlmaLinux führen SELinux (Security-Enhanced Linux) standardmäßig im Enforcing-Modus aus. Prüfen Sie dies mit getenforce. Der Befehl gibt Enforcing aus.

Docker-Container laufen unter dem SELinux-Typ container_t. Dieser Typ darf nur Dateien lesen und schreiben, die mit container_file_t gekennzeichnet sind. Ein Verzeichnis, das Sie auf dem Host erstellt haben, übernimmt das Label seines übergeordneten Pfads. Das ist nicht container_file_t. Der Zugriff des Containers wird verweigert, obwohl Eigentümer, Gruppe und Modus auf der Host-Seite korrekt aussehen. Reproduzieren Sie das Problem mit drei Befehlen:

sudo mkdir -p /srv/site
echo hello | sudo tee /srv/site/index.html
sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro nginx:alpine cat /usr/share/nginx/html/index.html

Der Container gibt Folgendes aus:

cat: can't open '/usr/share/nginx/html/index.html': Permission denied

Zwei Befehle zeigen die Ursache. ls -ldZ /srv/site gibt das Label aus. Für einen Pfad unter /srv lautet es system_u:object_r:var_t:s0 und nicht container_file_t. Anschließend gibt sudo ausearch -m avc -ts recent den Audit-Datensatz des Kernels aus. Er enthält avc: denied { read }, ein scontext=-Feld mit der Bezeichnung container_t, sowie ein tcontext=-Feld mit der Bezeichnung des Labels, das Sie gerade am Verzeichnis gesehen haben. Die Abweichung zwischen diesen beiden Feldern erklärt das gesamte Problem.

Die Lösung ist ein Suffix am Volume-Argument. Docker ändert das Label des Pfads automatisch:

sudo docker run --rm -v /srv/site:/usr/share/nginx/html:ro,z nginx:alpine cat /usr/share/nginx/html/index.html

:z in Kleinbuchstaben kennzeichnet den Inhalt als gemeinsam verwendet. Dadurch können mehrere Container dasselbe Verzeichnis verwenden. :Z in Großbuchstaben kennzeichnet den Inhalt als privat und nicht gemeinsam verwendet. Der Inhalt ist dann an einen Container gebunden. Ein zweiter Container, der denselben Pfad liest, erhält den Zugriff verweigert. Verwenden Sie :z für Verzeichnisse, auf die auch ein Sidecar- oder Backup-Container zugreift. Verwenden Sie :Z für ein Datenbankverzeichnis, dessen Eigentümer ein einzelner Container ist.

Die Docker-Dokumentation enthält hierzu einen wichtigen Warnhinweis, weil die Änderung des Labels rekursiv erfolgt. Das Einbinden eines Systemverzeichnisses wie /home oder /usr mit :Z „macht Ihren Host unbrauchbar. Möglicherweise müssen Sie die Dateien des Hosts manuell neu labeln“. Verwenden Sie diese Suffixe nur für Verzeichnisse, die Sie für den Container erstellt haben, niemals für einen Systempfad.

In Compose wird das Suffix an dieselbe Zeichenfolge angehängt:

services:
  web:
    image: nginx:alpine
    volumes:
      - /srv/site:/usr/share/nginx/html:ro,z

Zwei Einschränkungen führen besonders häufig zu Problemen. Das Flag --mount kann kein SELinux-Label setzen. Verwenden Sie daher -v, wenn Sie ein Label benötigen. Für benannte Volumes ist kein Suffix erforderlich, weil Docker die Verzeichnisse, die es unter /var/lib/docker/volumes erstellt, selbst mit dem richtigen Label versieht.

Deaktivieren Sie SELinux nicht. Verwenden Sie sudo setenforce 0 nur für einen Test von einer Minute. Wenn der Container dann funktioniert, liegt das Problem an einem Label, und :z ist die Lösung. Aktivieren Sie SELinux sofort wieder mit sudo setenforce 1. Unter Enterprise Linux können bei permission denied auf einem Bind-Mount zwei separate Ursachen vorliegen, die im Container identisch aussehen. Eine Ursache ist das SELinux-Label. Die andere ist der normale numerische Eigentümer und die numerische Gruppe. Genau dafür gibt es die Variablen PUID und PGID: das ist der Zweck der Variablen PUID und PGID. ls -lnZ zeigt Modus, numerischen Eigentümer und Label in einer Zeile an. So erkennen Sie, welches der beiden Probleme vorliegt.

Warum ist ein veröffentlichter Port erreichbar, obwohl firewalld geschlossen wirkt?

Firewalld ist die Standard-Firewall unter Rocky Linux und AlmaLinux. Prüfen Sie mit sudo systemctl is-active firewalld, ob sie läuft. Wenn Sie firewalld auf diesem System noch nicht konfiguriert haben, beginnen Sie mit SSH und einen Webport mit firewalld öffnen, weil der folgende Effekt erst verständlich ist, wenn Sie ein funktionierendes Zonen-Regelwerk zum Vergleich haben. Veröffentlichen Sie nun einen Port und prüfen Sie, was firewalld als geöffnet betrachtet:

sudo docker run -d --name web -p 8080:80 nginx:alpine
sudo firewall-cmd --list-ports

firewall-cmd gibt eine leere Zeile aus. Von einem anderen Rechner liefert curl -I http://YOUR_SERVER_IP:8080/ den Wert HTTP/1.1 200 OK. Der Port ist aus dem Internet erreichbar, aber Ihre Firewall meldet nichts.

Die Ursache ist der Weg, den das Paket nimmt. Die Zonenregeln von firewalld filtern Datenverkehr, der an den Host selbst adressiert ist. Ein veröffentlichter Port ist nicht an den Host adressiert: Docker installiert eine Destination-NAT-Regel (Network Address Translation), die das Ziel auf die Adresse des Containers umschreibt, bevor das Paket den Input-Pfad des Hosts erreicht. Deshalb leitet der Kernel das Paket weiter, statt es lokal zuzustellen. Docker ordnet seine Bridge-Schnittstellen anschließend einer firewalld-Zone namens docker zu, deren Target auf ACCEPT gesetzt ist, und fügt eine Forwarding-Policy namens docker-forwarding hinzu. Diese erlaubt die Weiterleitung aus jeder Zone in die Zone docker. Ihre Zonenregeln sehen das Paket nie.

Die sauberste Lösung benötigt keine Firewall-Regel. Binden Sie die Host-Seite der Veröffentlichung an Loopback und setzen Sie einen Reverse Proxy davor:

sudo docker rm -f web
sudo docker run -d --name web -p 127.0.0.1:8080:80 nginx:alpine
curl -I http://127.0.0.1:8080/

Der lokale Aufruf mit curl liefert HTTP/1.1 200 OK. Derselbe Aufruf von einem anderen Rechner kann keine Verbindung mehr herstellen. Wenn im Argument -p keine Host-Adresse angegeben ist, wird der Dienst auf jeder Schnittstelle veröffentlicht. Betrachten Sie ein einzelnes -p 8080:80 daher als bewusste Entscheidung, den Dienst öffentlich bereitzustellen.

Wenn ein Dienst nur von bestimmten Adressen erreichbar sein soll, reserviert Docker dafür eine eigene Chain. DOCKER-USER wird vor den eigenen Accept-Regeln von Docker verarbeitet. Eine dort gesetzte Regel bleibt deshalb erhalten, wenn Docker neu startet und seine Chains neu schreibt:

sudo iptables -I DOCKER-USER -i enp1s0 ! -s 203.0.113.10 -j DROP
sudo iptables -S DOCKER-USER

Übernehmen Sie den Schnittstellennamen aus ip route show default, statt eth0 anzunehmen. Aktuelle EL-Images verwenden beispielsweise Namen wie enp1s0 oder ens3. Unter Rocky und AlmaLinux ist der Befehl iptables eine Kompatibilitätsschicht über nftables, und die Chains von Docker sind darüber sichtbar. Regeln, die Sie auf diese Weise hinzufügen, gehen nach einem Reboot verloren, wenn Sie sie nicht speichern. Schreiben Sie sie daher in eine systemd-Unit, sobald Sie mit den Regeln zufrieden sind.

Docker Engine 28.0, veröffentlicht 2025, hat eine benachbarte Lücke geschlossen: Direkter gerouteter Zugriff auf Container-Ports, die nie veröffentlicht wurden, ist jetzt in der Chain DOCKER blockiert. Diese Änderung betrifft keine veröffentlichten Ports. Alles oben Beschriebene gilt daher weiterhin für aktuelle Versionen. Gewöhnen Sie sich an einen Ablauf: Testen Sie nach jedem sudo firewall-cmd --reload einen veröffentlichten Port erneut. Wenn er nicht mehr antwortet, installiert sudo systemctl restart docker die Docker-Regeln erneut.

Administratoren von Ubuntu stoßen mit einem anderen Tool auf dasselbe Problem. Siehe dazu warum veröffentlichte Docker-Ports ufw-Regeln ignorieren. In beiden Fällen ist der NAT-Pfad die Ursache. Nur die davorliegende Firewall ist eine andere.

Einen Benutzer ohne root-Rechte zur docker-Gruppe hinzufügen

sudo vor jedem docker-Befehl einzugeben, wird schnell lästig. Die docker-Gruppe macht das überflüssig:

sudo usermod -aG docker $USER
newgrp docker
docker run --rm hello-world

usermod -aG bearbeitet /etc/group. Ihre aktuelle Shell verwendet jedoch weiterhin ihre bisherige Gruppenliste. Die Änderung wird daher erst wirksam, wenn Sie eine neue Shell starten. newgrp docker startet eine Shell mit der zusätzlichen Gruppe, sodass Sie die Änderung sofort testen können. Neue SSH-Sitzungen übernehmen die Gruppe automatisch.

Beachten Sie genau, welche Berechtigungen diese Gruppe gewährt. Die Mitgliedschaft ermöglicht den Schreibzugriff auf /var/run/docker.sock. Jeder Prozess, der mit diesem Socket kommunizieren kann, kann den Daemon anweisen, einen Container zu starten, der das Host-Dateisystem einbindet. Ein Befehl zeigt, was das bedeutet:

docker run --rm -v /:/host alpine wc -l /host/etc/shadow

Damit lesen Sie eine Datei, auf die nur root zugreifen kann, von einem Benutzerkonto ohne sudo-Rechte aus. Die Post-Installationsdokumentation von Docker weist ebenfalls darauf hin: Die docker-Gruppe gewährt Berechtigungen, die root entsprechen. Fügen Sie ein Konto nur dann hinzu, wenn Sie diesem Konto auch sudo geben würden. Wenn Sie Konten auf einem neuen Server einrichten, entscheiden Sie dies zusammen mit dem restlichen Benutzer-Setup mit geringsten Berechtigungen auf einem VPS und nicht erst nachträglich.

Docker bietet außerdem einen rootless-Modus, in dem der Daemon als Benutzer ohne privilegierte Rechte ausgeführt wird. Dafür ist ein separater Installationsweg erforderlich. Außerdem ändert sich dadurch das Verhalten von Storage-Treibern und Ports unterhalb von 1024. Planen Sie diesen Modus daher als eigenes Projekt und nicht als Option, die Sie später ergänzen.

Was Sie als Nächstes tun sollten

Sie haben jetzt die Engine, das Compose-Plugin, einen Dienst, der einen Reboot übersteht, und die drei oben dokumentierten EL-spezifischen Verhaltensweisen. Der nächste Schritt ist ein compose.yaml pro Dienst. Der Aufbau einer Compose-Datei behandelt das Dateiformat und die Befehle, mit denen es verwendet wird. Wenn dies Ihr erster Container-Host ist, behandelt Docker auf einem VPS ausführen die Fragen zu Dimensionierung, Speicher und Image-Hygiene, die dieser Leitfaden offenlässt.

FAQ

Funktioniert das Docker-CentOS-Repository unter Rocky Linux und AlmaLinux?

Ja. Fügen Sie https://download.docker.com/linux/centos/docker-ce.repo mit dnf config-manager hinzu. baseurl in dieser Datei enthält $releasever. Rocky Linux und AlmaLinux ersetzen die Variable durch die Hauptversionsnummer. Dadurch wird auf einem EL-9-System der CentOS-9-Baum und auf einem EL-10-System der CentOS-10-Baum verwendet. Prüfen Sie die Ersetzung mit sudo dnf repoinfo docker-ce-stable und lesen Sie die Zeile Repo-baseurl. Ein Status code: 404 beim Abruf der Metadaten durch dnf bedeutet, dass die Variable zu einer Point-Release-Version aufgelöst wurde. Wenn Sie /etc/yum.repos.d/docker-ce.repo auf die reine Hauptversionsnummer ändern, wird das Problem behoben.

Können Docker und podman auf demselben Server installiert werden?

Die Docker-Dokumentation nennt podman und runc als konfligierende Pakete und weist darauf hin, dass beide vor der Installation von Docker Engine entfernt werden müssen. Der konkrete Konflikt betrifft das Paket podman-docker. Es stellt /usr/bin/docker bereit und wandelt jeden docker-Befehl in einen podman-Befehl um. Führen Sie rpm -qf "$(command -v docker)" aus, um zu sehen, welches Paket diesen Pfad bereitstellt. Beginnt die Ausgabe mit podman-docker, wird der Befehl von podman verarbeitet. Docker unterstützt keinen Betrieb beider Engines. Wählen Sie daher auf einem entsprechend wichtigen Server eine der beiden Engines aus.

Warum erhält mein Container bei einem Bind-Mount die Fehlermeldung „permission denied“?

SELinux ist unter Rocky Linux und AlmaLinux standardmäßig aktiviert. Container werden unter dem Typ container_t ausgeführt und dürfen nur auf Dateien mit dem Label container_file_t zugreifen. Ein von Ihnen erstelltes Verzeichnis hat daher möglicherweise das falsche Label. Der Zugriff wird dann unabhängig von Eigentümer und Zugriffsmodus verweigert. Prüfen Sie das mit ls -ldZ für den Host-Pfad und mit sudo ausearch -m avc -ts recent. Der zweite Befehl gibt avc: denied mit den beiden nicht übereinstimmenden Kontexten aus. Fügen Sie :z zum Volume-Argument hinzu, wenn der Inhalt zwischen Containern gemeinsam genutzt wird. Verwenden Sie :Z für Inhalt, der nur für einen Container bestimmt ist. Setzen Sie :Z niemals auf /home oder /usr, da die Neubezeichnung rekursiv erfolgt und den Host beschädigt.

Muss ich einen Port in firewalld öffnen, um einen Container-Port zu veröffentlichen?

Nein. Genau das ist das Problem. Die NAT-Regel von Docker ändert die Zieladresse, bevor das Paket den Eingabepfad des Hosts erreicht. Die Zonenregeln von firewalld prüfen das Paket daher nicht. Docker ordnet seine Bridges außerdem einer firewalld-Zone namens docker mit dem Target ACCEPT zu. Ein mit -p 8080:80 gestarteter Container ist aus dem Internet erreichbar, obwohl sudo firewall-cmd --list-ports keine Ausgabe liefert. Veröffentlichen Sie den Port mit -p 127.0.0.1:8080:80 an eine bestimmte Adresse, wenn nur der Host den Dienst erreichen soll. Alternativ können Sie Filterregeln in die Kette DOCKER-USER einfügen. Docker verarbeitet diese Kette vor seinen eigenen Accept-Regeln.

Ist es sicher, meinen Benutzer zur docker-Gruppe hinzuzufügen?

Damit gewähren Sie Root-Rechte. Ein Mitglied der docker-Gruppe kann in /var/run/docker.sock schreiben. Anschließend kann docker run --rm -v /:/host alpine wc -l /host/etc/shadow als Benutzer ohne sudo-Rechte eine Datei lesen, auf die nur root zugreifen darf. Die Dokumentation zur Docker-Installation bestätigt dieselbe Gleichwertigkeit. Fügen Sie nur Konten hinzu, denen Sie bereits sudo anvertrauen würden. Verwenden Sie weiterhin sudo docker für gemeinsam genutzte Konten oder Dienstkonten. Rootless Mode ist die Alternative, wenn Container unter einem nicht privilegierten Benutzer ausgeführt werden müssen. Er wird separat installiert und ist keine Einstellung innerhalb der normalen Installation.