GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Docker-Container können in Fedora 32 keine Verbindung zum Internet herstellen?

Obwohl das OP eine Problemumgehung für sein Problem gefunden und dieses Problem geschlossen hat, hat er das Hauptproblem nicht gefunden. Die Tatsache, dass das Bridged-Standardnetzwerk von Docker bridge mit dem Internet verbunden ist und airflowsetup_default Dies deutet nicht darauf hin, dass etwas mit der Docker-Netzwerkeinrichtung nicht stimmt.

Ich habe etwas recherchiert und es stellt sich heraus, dass Fedora 32 entschieden hat, dass es sich nicht wirklich darum kümmert, ob Docker daran arbeitet oder nicht.

Es ist nicht einmal möglich, Docker so zu installieren, wie es in der Dokumentation beschrieben ist, und wenn Sie das von Fedora bereitgestellte Paket installieren, funktioniert es immer noch nicht richtig - weitere Informationen zu diesem Problem finden Sie hier, hier und hier.

Das Hauptproblem besteht darin, dass in den Containern keine Internetverbindung besteht, wenn sie mit einem benutzerdefinierten Bridged-Netzwerk verbunden sind – unabhängig davon, ob es mit docker network create erstellt wurde oder per docker-compose.

Der Grund dafür ist einfach:Docker geht davon aus, dass die vom Betriebssystem verwendete Firewall iptables ist, aber Fedora 32 verwendet standardmäßig firewalld. Das bedeutet, dass Docker die Firewall nicht manuell konfigurieren kann – sie muss von Hand konfiguriert werden.

Zu Referenzzwecken werde ich zunächst beschreiben, wie Docker auf einer sauberen Fedora 32-Installation eingerichtet wird.

Führen Sie zuerst die folgenden Befehle aus:

sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER

Dadurch werden Cgroups so konfiguriert, dass sie mit dem Docker-Daemon kompatibel sind, und Ihrem Benutzer die Verwendung der Docker-CLI ohne sudo.

ermöglichen

Starten Sie als Nächstes Ihr System neu, um die Änderungen zu übernehmen, und führen Sie Folgendes aus:

sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker

um Docker zu installieren und zu aktivieren.

Wechseln Sie nun in das Verzeichnis, das Ihren docker-compose.yml enthält und führen Sie docker-compose up -d aus . Yuo sollte docker-compose sehen Erstellen eines Netzwerks für Sie und Erstellen des Containers. Wenn Ihr Container beim Start eine Internetverbindung benötigt (wie die OPs), kann er nicht gestartet werden.

Führen Sie nun sudo iptables-save | grep DOCKER aus und Sie sollten etwas sehen wie:

:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o br-b56fa303f315 -j DOCKER
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-b56fa303f315 ! -o br-b56fa303f315 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b56fa303f315 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-b56fa303f315 -j RETURN

docker0 ist Dockers standardmäßiges Bridged-Netzwerk, während br-b56fa303f315 ist das neue Netzwerk, das von docker-compose erstellt wurde (Ihre kann einen anderen Namen haben). Wenn Ihr Betriebssystem iptables verwendet alles würde wie erwartet funktionieren, tut es aber nicht, also müssen wir die Konfiguration von docker0 überprüfen in firewalld .

Führen Sie firewall-cmd --get-active-zones aus und Sie erhalten etwas Ähnliches wie:

docker
  interfaces: docker0
public
  interfaces: eth0 eth1

Sie können diesen bridge sehen Netzwerk ist in docker Zone, aber das neue Netzwerk ist es nicht. Tatsächlich ist es überhaupt nicht aufgeführt, was bedeutet, dass es sich in der Standardzone befindet. Sie können überprüfen, was das ist, indem Sie firewall-cmd --get-default-zone ausführen . Bei einer sauberen Installation von Fedora 32 ist es public .

Führen Sie also aus (denken Sie daran, br-b56fa303f315 zu ersetzen mit Ihrem Schnittstellennamen):

sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315

Führen Sie docker-compose up -d aus Wenn Ihr Dienst zuvor nicht gestartet werden konnte und voila - Ihr Container hat eine Netzwerkverbindung.

Wenn Sie Ihr System neu starten, wird es diese Konnektivität leider wieder verlieren.

Sie können dies verhindern, indem Sie Folgendes verwenden:

sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload

Wenn Sie jedoch neue Netzwerke erstellen oder vorhandene neu erstellen (zum Beispiel durch Ausführen von docker-compose down und dann docker-compose up -d erneut) müssen Sie den Vorgang wiederholen.

Was ist also die Lösung für dieses Problem?

Notieren Sie zunächst alle Netzwerkschnittstellen, die derzeit mit der Standardzone verbunden sind - in diesem Beispiel eth0 und eth1 .

Führen Sie dann Folgendes aus (ersetzen Sie public mit dem Namen Ihrer Standardzone)

sudo firewall-cmd --set-default-zone=docker
sudo firewall-cmd --permanent --zone=public --add-interface=eth0
sudo firewall-cmd --permanent --zone=public --add-interface=eth1
sudo firewall-cmd --reload

Jetzt sollten die Schnittstellen, die zuvor in Ihrer Standardzone waren, wieder vorhanden sein, aber alle neuen Schnittstellen (und damit alle neuen Docker-Netzwerke) werden automatisch zu docker hinzugefügt Zone, die ihnen volle Netzwerkkonnektivität bietet.


Linux
  1. Was ist Docker (und Linux-Container?)

  2. So verwenden Sie Docker Compose

  3. So verbinden Sie Docker-Container

  4. So listen Sie Docker-Container auf

  5. Docker in Docker kann Volume nicht mounten

So installieren Sie Docker auf Fedora 28 / Fedora 27

Traefik für Docker-Container auf Ubuntu

So installieren Sie Docker auf Fedora 35

So entfernen Sie Docker-Container

So stoppen Sie Docker-Container

So verwalten Sie Docker-Container