Přestože OP našel řešení jeho problému a uzavřel tento problém, nenašel kořenový problém. Skutečnost, že výchozí přemostění sítě Docker bridge
je připojen k internetu a airflowsetup_default
nenaznačuje, že je něco v nepořádku s nastavením sítě Docker.
Udělal jsem nějaký průzkum a ukázalo se, že Fedora 32 se rozhodla, že je jí vlastně jedno, jestli na ní Docker pracuje nebo ne.
Není ani možné nainstalovat Docker způsobem popsaným v dokumentaci a pokud nainstalujete balíček poskytovaný Fedorou, stále nefunguje správně - více informací o tomto problému naleznete zde, zde a zde.
Hlavním problémem je, že uvnitř kontejnerů není žádné internetové připojení, pokud jsou připojeny k jakékoli vlastní přemostěné síti – ať už byla vytvořena pomocí docker network create
nebo pomocí docker-compose.
Důvod je jednoduchý – Docker předpokládá, že firewall používaný OS je iptables, ale Fedora 32 standardně používá firewalld. To znamená, že Docker nemůže nakonfigurovat bránu firewall ručně – musí se nakonfigurovat ručně.
Pro referenční účely nejprve popíšu, jak nastavit Docker na čisté instalaci Fedory 32.
Nejprve spusťte následující příkazy:
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER
To nakonfiguruje cgroups tak, aby byly kompatibilní s démonem Docker a umožnily vašemu uživateli používat rozhraní Docker CLI bez sudo.
Poté restartujte systém, abyste použili změny, a spusťte:
sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker
nainstalovat a povolit Docker.
Nyní přejděte do adresáře, který obsahuje váš docker-compose.yml
a spusťte docker-compose up -d
. Yuo by měl vidět docker-compose
vytvoření sítě pro vás a následné vytvoření kontejneru. Pokud váš kontejner vyžaduje připojení k internetu při spuštění (jako OP), nebude možné jej spustit.
Nyní spusťte sudo iptables-save | grep DOCKER
a měli byste vidět něco jako:
: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
je výchozí přemostěná síť Dockeru, zatímco br-b56fa303f315
je nová síť vytvořená docker-compose
(vaše se může jmenovat jinak). Pokud váš operační systém používal iptables
vše by fungovalo podle očekávání, ale nefunguje, takže musíme zkontrolovat konfiguraci docker0
v firewalld
.
Spusťte firewall-cmd --get-active-zones
a dostanete něco podobného jako:
docker
interfaces: docker0
public
interfaces: eth0 eth1
Můžete vidět, že bridge
síť je v docker
zóny, ale nová síť není. Ve skutečnosti není uveden vůbec, což znamená, že je ve výchozí zóně. Můžete zkontrolovat, co to je, spuštěním firewall-cmd --get-default-zone
. V čisté instalaci Fedory 32 je to public
.
Takže spusťte (nezapomeňte nahradit br-b56fa303f315
s názvem vašeho rozhraní):
sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315
spustit docker-compose up -d
pokud se vaše služba dříve nespustila a voila – váš kontejner má síťové připojení.
Bohužel, pokud restartujete svůj systém, ztratí toto připojení znovu.
Můžete tomu zabránit pomocí:
sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload
Pokud však vytvoříte nějaké nové sítě nebo znovu vytvoříte stávající (například spuštěním docker-compose down
a poté docker-compose up -d
znovu), budete muset proces opakovat.
Jaké je tedy řešení tohoto problému?
Nejprve si zapište všechna síťová rozhraní, která jsou aktuálně připojena k výchozí zóně – v tomto příkladu eth0
a eth1
.
Poté spusťte následující (nahraďte public
s názvem vaší výchozí zóny)
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
Nyní by tam měla být znovu rozhraní, která byla dříve ve vaší výchozí zóně, ale všechna nová rozhraní (a tedy všechny nové sítě Docker) budou automaticky přidány do docker
zónu, která jim poskytne plnou síťovou konektivitu.