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öglichenStarten 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.