GNU/Linux >> Tutoriels Linux >  >> Linux

Les conteneurs Docker ne peuvent pas se connecter à Internet dans Fedora 32 ?

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.


Linux
  1. Qu'est-ce que Docker (et les conteneurs Linux ?)

  2. Comment utiliser Docker Compose

  3. Comment connecter des conteneurs Docker

  4. Pourquoi tout le monde utilise Docker ?

  5. Comment supprimer tous les conteneurs Docker

Comment installer Docker sur Fedora 28 / Fedora 27

Traefik pour les conteneurs Docker sur Ubuntu

Comment installer Docker sur Fedora 35

Comment supprimer les conteneurs Docker

Comment arrêter les conteneurs Docker

Comment gérer les conteneurs Docker