Anche se l'OP ha trovato una soluzione alternativa per il suo problema e ha chiuso questo problema, non ha trovato il problema principale. Il fatto che la rete con bridge predefinita di Docker bridge
è connesso a Internet e airflowsetup_default
non suggerisce che ci sia qualcosa che non va nella configurazione di rete di Docker.
Ho fatto delle ricerche e si scopre che Fedora 32 ha deciso che non gli importa davvero se Docker ci lavora o no.
Non è nemmeno possibile installare Docker nel modo descritto nella documentazione e se installi il pacchetto fornito da Fedora continua a non funzionare correttamente - ulteriori informazioni su questo problema possono essere trovate qui, qui e qui.
Il problema principale è che non c'è connettività Internet all'interno dei contenitori se sono connessi a qualsiasi rete con bridge personalizzata, indipendentemente dal fatto che sia stata creata utilizzando docker network create
o tramite docker-compose.
Il motivo è semplice:Docker presuppone che il firewall utilizzato dal sistema operativo sia iptables, ma Fedora 32 utilizza firewalld per impostazione predefinita. Ciò significa che Docker non può configurare manualmente il firewall:deve essere configurato manualmente.
A titolo di riferimento, descriverò innanzitutto come configurare Docker su un'installazione pulita di Fedora 32.
Per prima cosa esegui i seguenti comandi:
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER
Ciò configurerà i cgroup in modo che siano compatibili con il demone Docker e consentirà all'utente di utilizzare l'interfaccia a riga di comando di Docker senza sudo.
Quindi riavvia il sistema per applicare le modifiche ed esegui:
sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker
per installare e abilitare Docker.
Ora vai alla directory che contiene il tuo docker-compose.yml
ed esegui docker-compose up -d
. Dovresti vedere docker-compose
creando una rete per te e quindi creando il contenitore. Se il tuo contenitore richiede una connessione Internet all'avvio (come gli OP), non si avvierà.
Ora esegui sudo iptables-save | grep DOCKER
e dovresti vedere qualcosa come:
: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
è la rete con bridge predefinita di Docker, mentre br-b56fa303f315
è la nuova rete creata da docker-compose
(il tuo potrebbe avere un nome diverso). Se il tuo sistema operativo utilizzava iptables
tutto funzionerebbe come previsto, ma non funziona, quindi dobbiamo controllare la configurazione di docker0
in firewalld
.
Esegui firewall-cmd --get-active-zones
e otterrai qualcosa di simile a:
docker
interfaces: docker0
public
interfaces: eth0 eth1
Puoi vedere quel bridge
la rete è in docker
zona, ma la nuova rete no. In effetti non è affatto elencato, il che significa che si trova nella zona predefinita. Puoi verificare di cosa si tratta eseguendo firewall-cmd --get-default-zone
. Su un'installazione pulita di Fedora 32 è public
.
Quindi esegui (ricorda di sostituire br-b56fa303f315
con il nome della tua interfaccia):
sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315
eseguire docker-compose up -d
se il tuo servizio non è stato avviato in precedenza e voilà, il tuo contenitore ha connettività di rete.
Sfortunatamente se riavvii il tuo sistema perderà di nuovo quella connettività.
Puoi impedirlo usando:
sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload
Tuttavia, se crei nuove reti o ricrei quelle esistenti (ad esempio eseguendo docker-compose down
e poi docker-compose up -d
di nuovo) dovrai ripetere il processo.
Quindi qual è la soluzione a questo problema?
Innanzitutto, annota tutte le interfacce di rete attualmente collegate alla zona predefinita, in questo esempio eth0
e eth1
.
Quindi esegui quanto segue (sostituendo public
con il nome della zona predefinita)
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
Ora le interfacce che erano precedentemente nella tua zona predefinita dovrebbero essere di nuovo lì, ma tutte le nuove interfacce (e quindi tutte le nuove reti Docker) verranno automaticamente aggiunte a docker
zone, che darà loro piena connettività di rete.