GNU/Linux >> Tutoriales Linux >  >> Linux

¿Los contenedores Docker no pueden conectarse a Internet en Fedora 32?

Aunque el OP encontró una solución para su problema y cerró este problema, no encontró el problema raíz. El hecho de que la red en puente predeterminada de Docker bridge está conectado a Internet y airflowsetup_default no sugiere que algo esté mal con la configuración de red de Docker.

Investigué un poco y resulta que Fedora 32 decidió que realmente no le importa si Docker funciona o no.

Ni siquiera es posible instalar Docker de la forma descrita en la documentación y, si instala el paquete provisto por Fedora, aún no funciona correctamente; puede encontrar más información sobre este problema aquí, aquí y aquí.

El problema principal es que no hay conectividad a Internet dentro de los contenedores si están conectados a cualquier red puenteada personalizada, ya sea que se haya creado usando docker network create o por docker-compose.

La razón es simple:Docker asume que el firewall utilizado por el sistema operativo es iptables, pero Fedora 32 usa firewalld de forma predeterminada. Eso significa que Docker no puede configurar el firewall manualmente; debe configurarse a mano.

Como referencia, primero describiré cómo configurar Docker en una instalación limpia de Fedora 32.

Primero ejecuta los siguientes comandos:

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

Esto configurará cgroups para que sea compatible con el demonio Docker y le permitirá a su usuario usar la CLI de Docker sin sudo.

A continuación, reinicie su sistema para aplicar los cambios y ejecute:

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

para instalar y habilitar Docker.

Ahora ve al directorio que contiene tu docker-compose.yml y ejecuta docker-compose up -d . Yuo debería ver docker-compose creando una red para usted y luego creando el contenedor. Si su contenedor requiere conexión a Internet al inicio (como los OP), no podrá iniciarse.

Ahora ejecuta sudo iptables-save | grep DOCKER y deberías ver algo como:

: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 es la red puenteada predeterminada de Docker, mientras que br-b56fa303f315 es la nueva red creada por docker-compose (el tuyo puede tener un nombre diferente). Si su sistema operativo estuviera usando iptables todo funcionaría como se esperaba, pero no es así, por lo que debemos verificar la configuración de docker0 en firewalld .

Ejecute firewall-cmd --get-active-zones y obtendrás algo similar a:

docker
  interfaces: docker0
public
  interfaces: eth0 eth1

Puedes ver que bridge la red está en docker zona, pero la nueva red no lo es. De hecho, no aparece en la lista, lo que significa que está en la zona predeterminada. Puede verificar qué es eso ejecutando firewall-cmd --get-default-zone . En una instalación limpia de Fedora 32 es public .

Así que corre (recuerda reemplazar br-b56fa303f315 con el nombre de su interfaz):

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

ejecutar docker-compose up -d si su servicio no pudo iniciarse anteriormente y listo, su contenedor tiene conectividad de red.

Desafortunadamente, si reinicia su sistema, perderá esa conectividad nuevamente.

Puede evitar eso usando:

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

Sin embargo, si crea nuevas redes o recrea las existentes (por ejemplo, ejecutando docker-compose down y luego docker-compose up -d otra vez) tendrás que repetir el proceso.

Entonces, ¿cuál es la solución a este problema?

Primero, anote todas las interfaces de red que están conectadas actualmente a la zona predeterminada; en este ejemplo, eth0 y eth1 .

Luego ejecute lo siguiente (reemplazando public con el nombre de su zona predeterminada)

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

Ahora las interfaces que estaban anteriormente en su zona predeterminada deberían volver a estar allí, pero todas las nuevas interfaces (y por lo tanto todas las nuevas redes de Docker) se agregarán automáticamente a docker zona, lo que les dará conectividad de red completa.


Linux
  1. Cómo usar Docker Compose

  2. Cómo conectar contenedores Docker

  3. Introducción a los contenedores Docker

  4. ¿Por qué todos usan Docker?

  5. Docker en Docker no puede montar el volumen

Cómo instalar Docker en Fedora 28 / Fedora 27

Traefik para contenedores Docker en Ubuntu

Cómo instalar Docker en Fedora 35

Cómo eliminar contenedores Docker

Cómo detener los contenedores de Docker

Cómo gestionar contenedores Docker