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.