Mon conteneur docker n'a pas Internet


139

Je l'ai fait fonctionner correctement mais maintenant il s'est arrêté. J'ai essayé les commandes suivantes sans succès:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - à la fois sur l'hôte et sur le conteneur

Tout ce que je reçois, c'est unknown host google.com. Docker version 0.7.0

Des idées?

PS également ufwdésactivé


9
Votre question a résolu mon problème: dû courir sysctl -w net.ipv4.ip_forward=1(sur Centos 6)
qwertzguy

Puisque vous pouvez avoir le problème avec le routage dns docker, vérifiez cette solution similaire stackoverflow.com/questions/35515203/...
Aditya Kresna Permana

Même chose ici, après avoir corrigé le fichier /etc/resolv.conf sur la boîte hôte, il ne fonctionnera pas sanssysctl -w net.ipv4.ip_forward=1
Reeebuuk

Vérifiez également que vous avez les valeurs correctes pour /etc/resolv.confsur la machine hôte
Hanxue

pour moi après sysctl -w net.ipv4.ip_forward=1avoir dû courir sudo service docker restart.
Asif Ali le

Réponses:


101

La première chose à vérifier est exécutée cat /etc/resolv.confdans le conteneur Docker . S'il a un serveur DNS non valide, tel que nameserver 127.0.x.x, le conteneur ne pourra pas résoudre les noms de domaine en adresses IP, donc ping google.coméchouera.

La deuxième chose à vérifier est exécutée cat /etc/resolv.confsur la machine hôte . Docker copie essentiellement les hôtes /etc/resolv.confdans le conteneur à chaque fois qu'un conteneur est démarré. Donc, si l'hôte /etc/resolv.confest erroné, le conteneur docker le sera également.

Si vous constatez que l'hôte /etc/resolv.confest erroné, vous avez 2 options:

  1. Codez en dur le serveur DNS dans daemon.json. C'est facile, mais pas idéal si vous vous attendez à ce que le serveur DNS change.

  2. Réparez les fichiers /etc/resolv.conf. C'est un peu plus compliqué, mais il est généré dynamiquement et vous ne codez pas en dur le serveur DNS.


1. Serveur DNS Hardcode dans docker daemon.json

  • Éditer /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
  • Redémarrez le démon docker pour que ces modifications prennent effet:
    sudo systemctl restart docker

  • Désormais, lorsque vous exécutez / démarrez un conteneur, le menu fixe se remplit /etc/resolv.confavec les valeurs de daemon.json.


2. Corrigez les /etc/resolv.conf

A. Ubuntu 16.04 et versions antérieures

  • Pour Ubuntu 16.04 et versions antérieures, a /etc/resolv.confété généré dynamiquement par NetworkManager.

  • Commentez la ligne dns=dnsmasq(avec un #) dans /etc/NetworkManager/NetworkManager.conf

  • Redémarrez le NetworkManager pour régénérer /etc/resolv.conf:
    sudo systemctl restart network-manager

  • Vérifiez sur l'hôte: cat /etc/resolv.conf

B. Ubuntu 18.04 et versions ultérieures

  • Ubuntu 18.04 a changé pour utiliser systemd-resolvedpour générer/etc/resolv.conf . Maintenant, par défaut, il utilise un cache DNS local 127.0.0.53. Cela ne fonctionnera pas à l'intérieur d'un conteneur, donc Docker utilisera par défaut le serveur DNS 8.8.8.8 de Google, ce qui peut ne pas fonctionner pour les personnes derrière un pare-feu.

  • /etc/resolv.confest en fait un lien symbolique ( ls -l /etc/resolv.conf) qui pointe vers /run/systemd/resolve/stub-resolv.conf(127.0.0.53) par défaut dans Ubuntu 18.04.

  • Changez simplement le lien symbolique vers /run/systemd/resolve/resolv.conflequel pointer , qui répertorie les vrais serveurs DNS:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • Vérifiez sur l'hôte: cat /etc/resolv.conf

Vous devriez maintenant avoir une valeur valide /etc/resolv.confsur l'hôte pour que le docker copie dans les conteneurs.


1
Cela a résolu le problème sur Ubuntu 16.04 avec Docker 17.09.
Luís de Sousa

2
Cela a résolu mon problème (identique à OP, Ubuntu 14.04 / Docker 18.01.0-ce). Ce lien peut être utile pour tester la connexion Internet sans ping si vous n'avez pas de commande ping sur votre image docker. Si votre hôte n'a pas systemctl(Ubuntu 14.04), essayez Comment redémarrer le service réseau? et / ou redémarrez votre ordinateur.
Benjamin

A travaillé comme un charme!
Homewrecker

1
Cela fonctionne sur Ubuntu 18.04 (option B). Cependant, docker n'a pas transféré le maintenant correct /etc/resolv.confdans le conteneur lors de la construction, j'ai dû copier manuellement le fichier dans le conteneur.
glaux

1
Sur ma machine (RedHat 7.4), le fichier de configuration de l'hôte est correct, mais le fichier de conteneurs pointe toujours vers 172.0.0.11. Alors que faire maintenant?
Martin Majewski

90

Corrigé en suivant ce conseil:

[...] pouvez-vous essayer de tout réinitialiser?

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

Cela forcera docker à recréer le pont et à réinitialiser toutes les règles du réseau

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

Il semble que l'interface a été «pendue» d'une manière ou d'une autre.

Mise à jour pour les versions plus récentes de docker:

La réponse ci-dessus peut encore faire le travail pour vous, mais cela fait longtemps que cette réponse n'a pas été publiée et docker est plus perfectionné maintenant, alors assurez-vous de les essayer d'abord avant de vous attaquer à iptablestout.

sudo service docker restart ou (si vous êtes dans une distribution Linux qui n'utilise pas upstart) sudo systemctl restart docker


31
docker -déchoue. Il n'y a pas de -ddrapeau.
Luís de Sousa

1
Pour ceux qui ont toujours le problème, il y a un problème ouvert sur le github de Moby qui a été ouvert depuis plus d'un an maintenant: github.com/moby/moby/issues/26567
Nepoxx

1
@Pawan:ip link del docker0
drewrockshard

1
ou installez bridge-utils
cjdcordeiro

5
docker -dn'existe pas dans les versions plus récentes. Au lieu de cela:, service docker stopalors dockerd, alorsservice docker start
Telmo Marques

64

La manière prévue de redémarrer docker n'est pas de le faire manuellement mais d'utiliser la servicecommande ou init:

service docker restart

5
si vous êtes dans une distribution Linux qui n'utilise pas upstart, sudo systemctl restart docker a fonctionné pour moi
jeffrey

le redémarrage a bien fonctionné. Je ne sais pas si cela a à voir avec le fait que je l'ai activé pour "démarrage automatique" ( systemctl enable docker)
Lucas Pottersky

Ne semble pas pertinent par rapport à la question du PO.
Kevin Buchs

C'est un peu le cas, car dans la situation décrite par OP, la réinitialisation de docker réinitialise les interfaces réseau, réactivant ainsi l'accès à Internet. Il est vrai que cela n'aborde pas POURQUOI ça casse parfois, mais cela apporte une solution au problème.
bitmask

Mais dans un environnement de production, redémarrer le docker est impossible. Comment résoudre le problème sur ce cas?
Suyanhanx

22

Mise à jour de cette question avec une réponse pour OSX (en utilisant Docker Machine)

Si vous exécutez Docker sur OSX à l'aide de Docker Machine, les éléments suivants ont fonctionné pour moi:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)

Ensuite (du moins d'après mon expérience), si vous envoyez un ping à google.com à partir d'un conteneur, tout ira bien.


Également travaillé dans Windows pour que l'accès au réseau fonctionne à nouveau.
Mikael Lepistö

1
Cela a fonctionné pour moi. J'ai une icône de menu fixe dans la barre de menu supérieure, dans le menu j'ai eu une option "redémarrer". Après cela, le réseautage était à nouveau bien
olidem

8

Je ne sais pas ce que je fais mais cela a fonctionné pour moi:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start

2
beau ruban adhésif!
dctremblay

1
Votre réponse a aidé à résoudre un problème similaire. J'ai passé des heures là-dessus! Après une installation incomplète de Kubespray, les conteneurs Docker ont perdu Internet avec le message «Échec temporaire de la résolution» lors de la tentative de ping sur un hôte public ou une adresse IP. Donc je n'avais pas cette règle qui est obligatoire - iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE. Vous pouvez vérifier si vous avez cette règle aveciptables -t nat -L POSTROUTING
laimison

6

J'utilisais DOCKER_OPTS="--dns 8.8.8.8"et j'ai découvert plus tard et que mon conteneur n'avait pas d'accès direct à Internet mais pouvait accéder à mon intranet d'entreprise. J'ai changé DOCKER_OPTScomme suit:

DOCKER_OPTS="--dns <internal_corporate_dns_address"

le remplacement internal_corporate_dns_addresspar l'adresse IP ou le FQDN de notre DNS et le docker redémarré en utilisant

sudo service docker restart

puis a engendré mon conteneur et vérifié qu'il avait accès à Internet.


5

J'étais perplexe lorsque cela s'est produit au hasard pour moi pour l'un de mes conteneurs, alors que les autres conteneurs allaient bien. Le conteneur était attaché à au moins un réseau non interne , il n'y avait donc rien de mal avec la Composedéfinition. Le redémarrage du démon VM / docker n'a pas aidé. Ce n'était pas non plus un problème DNS car le conteneur ne pouvait même pas pingune adresse IP externe. Ce qui m'a résolu, c'était de recréer le (s) réseau (s) docker. Dans mon cas, a docker-compose down && docker-compose upfonctionné.

Composer

Cela force la recréation de tous les réseaux de tous les conteneurs:

docker-compose down && docker-compose up

Mode essaim

Je suppose que vous venez de supprimer et de recréer le service, qui recrée le (s) réseau (s) du service:

docker service rm some-service

docker service create ...

Si le (s) réseau (s) du conteneur sont externes

Supprimez et recréez simplement les réseaux externes de ce service:

docker network rm some-external-network

docker network create some-external-network


4

Pour moi, c'était le pare-feu de l'hôte. J'ai dû autoriser DNS sur le pare-feu de l'hôte. Et a également dû redémarrer le docker après avoir modifié le paramètre de pare-feu hôte.


Ou vous pouvez désactiver les iptables par sudo service iptables stopet sudo chkconfig iptables off(sur CentOS / RHEL).
MichaelZ

4

Aucun accès Internet ne peut également être causé par des paramètres de proxy manquants . Dans ce cas, --network hostpeut ne pas fonctionner non plus. Le proxy peut être configuré en définissant les variables d'environnement http_proxyet https_proxy:

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 

N'oubliez pas de définir no_proxy également, sinon toutes les requêtes (y compris celles adressées à localhost) passeront par le proxy.

Plus d'informations: Paramètres de proxy dans le Wiki Archlinux.


1
C'était la solution pour moi. Attention cependant: j'utilisais alpine, qui a une implémentation busybox de wget qui semble ignorer les paramètres de proxy, donc je ne voyais pas l'avantage d'avoir les variables d'environnement définies.
pelson

Merci pour l'indice sur busybox; Je ne le savais pas encore!
Simon A. Eugster

1
sachez que certains os nécessitent des majuscules comme dans le lien de documentation .
Flo le

3

Pour moi, c'était une règle de transfert iptables. Pour une raison quelconque, la règle suivante, associée aux règles iptables de docker, provoquait l'atteinte de tout le trafic sortant des conteneurs localhost:8080:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

3
Alors ... quelle est la solution? :) J'ai la première règle et j'en ai besoin pour rediriger le trafic entrant sur 80 à 8080. Comment puis-je changer cela pour ne pas affecter le trafic sortant?
mrooney

3

J'ai eu le problème sur Ubuntu 18.04. Cependant, le problème était avec le DNS. J'étais dans un réseau d'entreprise qui a son propre serveur DNS et bloque d'autres serveurs DNS. Il s'agit de bloquer certains sites Web (porno, torrents, etc.)

Pour résoudre votre problème

  1. trouver votre DNS sur la machine hôte
  2. utilisez --dns your_dns comme suggéré par @jobin

    docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash


2

Sous Windows (8.1), j'ai tué l'interface virtualbox (via taskmgr) et cela a résolu le problème.


2

Vous avez peut-être démarré votre docker avec des options DNS --dns 172.x.x.x

J'ai eu la même erreur et j'ai supprimé les options de /etc/default/docker

Les lignes:

# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.x.x.x"

2

Pour Ubuntu 19.04 utilisant openconnect 8.3 pour VPN, j'ai dû créer un lien symbolique /etc/resolve.conf vers celui de systemd (opposé à answerby wisbucky)

sudo ln -sf /etc/resolv.conf /run/systemd/resolve/resolv.conf

Étapes de débogage

  1. Connectez-vous au VPN d'entreprise
  2. Recherchez les paramètres VPN corrects dans /etc/resolv.conf ou /run/systemd/resolve/resolv.conf
  3. Quel que soit le paramètre DNS correct, nous le lierons à l'autre fichier (Conseil: placez-en un avec les paramètres corrects à gauche de l'affectation)

Version Docker: version Docker 19.03.0-rc2, build f97efcc


2
Je vous remercie. Avec Ubuntu 18.04, lors de la connexion au VPN de l'entreprise, seul le fichier /etc/resolve.conf était mis à jour par le DHCP et le / run / systemd / résoudre / résoudre / conf restait constant / statique. Cette solution a aidé. Désormais, les conteneurs de la machine locale se connectent aux serveurs en VPN (ce qui ne se produisait pas plus tôt pour moi)
Dexter2305

1

Si vous êtes sous OSX, vous devrez peut-être redémarrer votre machine après avoir installé Docker. Cela a parfois posé problème.


1

À l'origine, mon conteneur docker pouvait atteindre Internet externe (il s'agit d'un service / conteneur docker fonctionnant sur un Amazon EC2).

Étant donné que mon application est une API, j'ai suivi la création de mon conteneur (il a réussi à extraire tous les packages nécessaires) en mettant à jour mes tables IP pour acheminer tout le trafic du port 80 vers le port que mon API (fonctionnant sur docker) était écoute.

Puis, plus tard, lorsque j'ai essayé de reconstruire le conteneur, cela a échoué. Après de nombreuses difficultés, j'ai découvert que l'étape précédente (définir la règle de transfert de port IPTable) avait gâché la capacité de mise en réseau externe du docker.

Solution: arrêtez votre service IPTable:

sudo service iptables stop

Redémarrez le démon Docker:

sudo service docker restart

Ensuite, essayez de reconstruire votre conteneur. J'espère que cela t'aides.


Suivre

J'ai complètement oublié que je n'avais pas besoin de jouer avec les tables IP pour transférer le trafic entrant à 80 vers le port sur lequel l'API fonctionnant sur docker fonctionnait. Au lieu de cela, j'ai juste aliasé le port 80 sur le port sur lequel l'API dans docker fonctionnait:

docker run -d -p 80:<api_port> <image>:<tag> <command to start api>


1

Il suffit d'ajouter ceci ici au cas où quelqu'un rencontrerait ce problème dans un conteneur virtualbox exécutant docker. J'ai reconfiguré le réseau de virtualbox en ponté au lieu de nat, et le problème a disparu.


1

pour moi, mon problème était dû au fait que iptables-services n'était pas installé, cela a fonctionné pour moi (CentOS):

sudo yum install iptables-services
sudo service docker restart

rappelez-vous de démarrer et d'activer les services iptable aussi
Jay

1

Sur centos 8, mon problème était que je n'avais pas installé et démarré iptables avant de démarrer le service docker. Assurez-vous que le service iptables est opérationnel avant de démarrer le service docker.


0

J'ai également rencontré un tel problème en essayant de configurer un projet à l'aide de Docker-Compose sur Ubuntu.

Le Docker n'avait aucun accès à Internet, quand j'ai essayé de cingler n'importe quelle adresse IP ou nslookup une URL - il a échoué tout le temps.

J'ai essayé toutes les solutions possibles avec la résolution DNS décrites ci-dessus en vain.

J'ai passé toute la journée à essayer de savoir ce qui se passait, et j'ai finalement découvert que la cause de tous les problèmes était l'antivirus, en particulier son pare-feu qui, pour une raison quelconque, empêchait Docker d'obtenir l'adresse IP et le port.

Quand je l'ai désactivé, tout fonctionnait bien.

Donc, si vous avez installé un antivirus et que rien ne résout le problème, le problème pourrait être le pare-feu de l'antivirus.


0

J'ai eu un problème similaire ces derniers jours. Pour moi, la cause était une combinaison de systemd, docker et mon fournisseur d'hébergement. J'utilise CentOS à jour (7.7.1908).

Mon hébergeur génère automatiquement un fichier de configuration pour systemd-networkd. À partir de systemd 219 qui est la version actuelle de CentOS 7, systemd-networkd a pris le contrôle des paramètres sysctl liés au réseau. Docker semble être incompatible avec cette version et réinitialisera les indicateurs de transfert IP à chaque fois qu'un conteneur est lancé.

Ma solution était d'ajouter IPForward=truedans la section [Network]-section de mon fichier de configuration généré par le fournisseur. Ce fichier peut se trouver à plusieurs endroits, probablement au format /etc/systemd/network.

Le processus est également décrit dans la documentation officielle du docker: https://docs.docker.com/v17.09/engine/installation/linux/linux-postinstall/#ip-forwarding-problems


Pouvez-vous préciser l'emplacement exact où vous avez défini ce paramètre? J'ai exactement le même emplacement que vous, j'exécute une VM sur Google Cloud Platform et je n'ai trouvé aucun fichier * .network sur le serveur. Seulement sur /usr/lib/sysctl.d/50-default.confmais la syntaxe est différente.
el.severo

Mon cluster est autogéré et mon fournisseur ne fait que le démarrage de base lors de l'installation. La configuration du réseau était /etc/systemd/network/10-mainif.networkpour moi. Les autres endroits que vous pourriez vérifier sont /usr/local/lib/systemd/et /usr/lib/systemd/selon la page de manuel systemd.
BlackCetha le

0

pour moi, en utilisant centos 7.4, ce n'était pas un problème avec /etc/resolve.conf, iptables, les règles nat iptables ni le docker lui-même. Le problème est que l'hôte n'a pas le paquet bridge-utils dont docker a besoin pour construire le pont à l'aide de la commande brctl. yum installez -y bridge-utils et redémarrez docker, résolvez le problème.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.