GNU/Linux >> Linux Esercitazione >  >> Linux

I contenitori Docker non possono connettersi a Internet in Fedora 32?

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.


Linux
  1. Che cos'è Docker (e contenitori Linux?)

  2. Come usare Docker Compose

  3. Come collegare i contenitori Docker

  4. Jconsole non riesce a connettersi

  5. Il comando Docker non può connettersi al daemon Docker

Come installare Docker su Fedora 28 / Fedora 27

Traefik per i contenitori Docker su Ubuntu

Come installare Docker su Fedora 35

Come rimuovere i contenitori Docker

Come fermare i container Docker

Come gestire i container Docker