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 ufw
désactivé
sysctl -w net.ipv4.ip_forward=1
(sur Centos 6)sysctl -w net.ipv4.ip_forward=1
/etc/resolv.conf
sur la machine hôtesysctl -w net.ipv4.ip_forward=1
avoir dû courirsudo service docker restart
.Réponses:
La première chose à vérifier est exécutée
cat /etc/resolv.conf
dans le conteneur Docker . S'il a un serveur DNS non valide, tel quenameserver 127.0.x.x
, le conteneur ne pourra pas résoudre les noms de domaine en adresses IP, doncping google.com
échouera.La deuxième chose à vérifier est exécutée
cat /etc/resolv.conf
sur la machine hôte . Docker copie essentiellement les hôtes/etc/resolv.conf
dans le conteneur à chaque fois qu'un conteneur est démarré. Donc, si l'hôte/etc/resolv.conf
est erroné, le conteneur docker le sera également.Si vous constatez que l'hôte
/etc/resolv.conf
est erroné, vous avez 2 options: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.
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
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.conf
avec les valeurs dedaemon.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-resolved
pour 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.conf
est 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.conf
lequel 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.conf
sur l'hôte pour que le docker copie dans les conteneurs.la source
systemctl
(Ubuntu 14.04), essayez Comment redémarrer le service réseau? et / ou redémarrez votre ordinateur./etc/resolv.conf
dans le conteneur lors de la construction, j'ai dû copier manuellement le fichier dans le conteneur.Corrigé en suivant ce conseil:
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 à
iptables
tout.sudo service docker restart
ou (si vous êtes dans une distribution Linux qui n'utilise pas upstart)sudo systemctl restart docker
la source
docker -d
échoue. Il n'y a pas de-d
drapeau.ip link del docker0
docker -d
n'existe pas dans les versions plus récentes. Au lieu de cela:,service docker stop
alorsdockerd
, alorsservice docker start
La manière prévue de redémarrer docker n'est pas de le faire manuellement mais d'utiliser la
service
commande ou init:la source
systemctl enable docker
)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:
Ensuite (du moins d'après mon expérience), si vous envoyez un ping à google.com à partir d'un conteneur, tout ira bien.
la source
Je ne sais pas ce que je fais mais cela a fonctionné pour moi:
la source
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
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_OPTS
comme suit:le remplacement
internal_corporate_dns_address
par l'adresse IP ou le FQDN de notre DNS et le docker redémarré en utilisantpuis a engendré mon conteneur et vérifié qu'il avait accès à Internet.
la source
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
Compose
dé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 pasping
une adresse IP externe. Ce qui m'a résolu, c'était de recréer le (s) réseau (s) docker. Dans mon cas, adocker-compose down && docker-compose up
fonctionné.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
la source
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.
la source
sudo service iptables stop
etsudo chkconfig iptables off
(sur CentOS / RHEL).Aucun accès Internet ne peut également être causé par des paramètres de proxy manquants . Dans ce cas,
--network host
peut ne pas fonctionner non plus. Le proxy peut être configuré en définissant les variables d'environnementhttp_proxy
ethttps_proxy
: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.
la source
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
:la source
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
utilisez --dns your_dns comme suggéré par @jobin
docker run --dns your_dns -it --name cowsay --hostname cowsay debian bash
la source
Sous Windows (8.1), j'ai tué l'interface virtualbox (via taskmgr) et cela a résolu le problème.
la source
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:
la source
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
Version Docker: version Docker 19.03.0-rc2, build f97efcc
la source
Si vous êtes sous OSX, vous devrez peut-être redémarrer votre machine après avoir installé Docker. Cela a parfois posé problème.
la source
À 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>
la source
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.
la source
pour moi, mon problème était dû au fait que iptables-services n'était pas installé, cela a fonctionné pour moi (CentOS):
la source
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.
la source
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.
la source
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=true
dans 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
la source
/usr/lib/sysctl.d/50-default.conf
mais la syntaxe est différente./etc/systemd/network/10-mainif.network
pour moi. Les autres endroits que vous pourriez vérifier sont/usr/local/lib/systemd/
et/usr/lib/systemd/
selon la page de manuel systemd.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.
la source