Même si l'OP a trouvé une solution de contournement à son problème et a fermé ce problème, il n'a pas trouvé le problème racine. Le fait que le réseau ponté par défaut de Docker bridge
est connecté à Internet et airflowsetup_default
Cela ne signifie pas que quelque chose ne va pas avec la configuration du réseau Docker.
J'ai fait quelques recherches et il s'avère que Fedora 32 a décidé qu'il ne se souciait pas vraiment de savoir si Docker fonctionnait dessus ou non.
Il n'est même pas possible d'installer Docker d'une manière décrite dans la documentation et si vous installez le paquet fourni par Fedora, cela ne fonctionne toujours pas correctement - plus d'informations sur ce problème peuvent être trouvées ici, ici et ici.
Le principal problème est qu'il n'y a pas de connectivité Internet à l'intérieur des conteneurs s'ils sont connectés à un réseau ponté personnalisé - qu'il ait été créé à l'aide de docker network create
ou par docker-compose.
La raison en est simple - Docker suppose que le pare-feu utilisé par le système d'exploitation est iptables, mais Fedora 32 utilise firewalld par défaut. Cela signifie que Docker ne peut pas configurer le pare-feu manuellement - il doit être configuré à la main.
À des fins de référence, je décrirai d'abord comment configurer Docker sur une installation Fedora 32 propre.
Exécutez d'abord les commandes suivantes :
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER
Cela configurera les cgroups pour qu'ils soient compatibles avec le démon Docker et permettra à votre utilisateur d'utiliser Docker CLI sans sudo.
Redémarrez ensuite votre système pour appliquer les modifications et exécuter :
sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker
pour installer et activer Docker.
Allez maintenant dans le répertoire qui contient votre docker-compose.yml
et exécutez docker-compose up -d
. Vous devriez voir docker-compose
créer un réseau pour vous, puis créer le conteneur. Si votre conteneur nécessite une connexion Internet au démarrage (comme les OP), il ne démarrera pas.
Exécutez maintenant sudo iptables-save | grep DOCKER
et vous devriez voir quelque chose comme :
: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
est le réseau ponté par défaut de Docker, tandis que br-b56fa303f315
est le nouveau réseau créé par docker-compose
(le vôtre peut avoir un nom différent). Si votre système d'exploitation utilisait iptables
tout fonctionnerait comme prévu, mais ce n'est pas le cas, nous devons donc vérifier la configuration de docker0
en firewalld
.
Exécutez firewall-cmd --get-active-zones
et vous obtiendrez quelque chose de similaire à :
docker
interfaces: docker0
public
interfaces: eth0 eth1
Vous pouvez voir que bridge
le réseau est en docker
zone, mais pas le nouveau réseau. En fait, il n'est pas du tout répertorié, ce qui signifie qu'il se trouve dans la zone par défaut. Vous pouvez vérifier ce que c'est en exécutant firewall-cmd --get-default-zone
. Sur une nouvelle installation de Fedora 32, c'est public
.
Alors lancez (n'oubliez pas de remplacer br-b56fa303f315
avec le nom de votre interface) :
sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315
exécutez docker-compose up -d
si votre service n'a pas pu démarrer précédemment et le tour est joué - votre conteneur dispose d'une connectivité réseau.
Malheureusement, si vous redémarrez votre système, il perdra à nouveau cette connectivité.
Vous pouvez empêcher cela en utilisant :
sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload
Cependant, si vous créez de nouveaux réseaux ou recréez des réseaux existants (par exemple en exécutant docker-compose down
puis docker-compose up -d
à nouveau), vous devrez répéter le processus.
Alors, quelle est la solution à ce problème ?
Tout d'abord, notez toutes les interfaces réseau qui sont actuellement attachées à la zone par défaut - dans cet exemple eth0
et eth1
.
Exécutez ensuite ce qui suit (en remplaçant public
avec le nom de votre zone par défaut)
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
Maintenant, les interfaces qui étaient auparavant dans votre zone par défaut devraient y être à nouveau, mais toutes les nouvelles interfaces (et donc tous les nouveaux réseaux Docker) seront automatiquement ajoutées à docker
zone, ce qui leur donnera une connectivité réseau complète.