Je ne peux pas atteindre le réseau externe à partir de conteneurs de composition de docker.
Considérez le fichier docker-compose suivant:
version: '2'
services:
nginx:
image: nginx
Utilisation du simple docker run -it nginx bash
J'arrive à atteindre des adresses IP externes ou Internet (ping www.google.com
).
D'un autre côté, si j'utilise docker-compose et attache au conteneur, je ne peux pas atteindre les adresses IP/DNS externes.
informations sur le docker:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 1.12.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 7
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge null Host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.859 GiB
Name: ***
ID: ****
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
127.0.0.0/8
docker-compose 1.8.1, build 878cff1
fichier daemon.json:
{
"iptables" : false,
"dns" : ["8.8.8.8","8.8.4.4"]
}
La dernière fois que j'ai eu un problème comme ça, je l'ai résolu comme ceci:
https://github.com/docker/docker/issues/866#issuecomment-192183
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
Cela obligera Docker à recréer le pont et à réinitier toutes les règles du réseau.
Quant aux raisons pour lesquelles cela se produit, je n'ai pas de bonnes réponses. Mais j'ai récemment remonté le problème à journald
. Lorsque je redémarre journald
(par exemple parce que j'ai changé sa configuration), la résolution DNS à l'intérieur des conteneurs docker-compose se casse de manière cohérente/reproductible. Je ne sais pas pourquoi exactement, je peux seulement dire que c'est un moyen fiable pour moi de le reproduire sur RHEL.
[~ # ~] modifier [~ # ~] La commande docker -d
peut ne pas fonctionner pour vous en fonction de la version de docker que vous utilisez mais ne vous en faites pas, vous pouvez omettre cette commande.
Vérifier /etc/default/docker
pour vous assurer qu'il n'a pas la ligne suivante:
DOCKER_OPTS="--iptables=false"
Vérifiez également /etc/docker/daemon.json
pour vous assurer qu'il n'a pas la clé suivante:
{
"iptables":false
}
Nous avons ajouté cela sur un serveur pour que UFW fonctionne avec Docker. Nous avons ensuite changé pour un pare-feu externe. Passé des âges à chercher la raison pour laquelle le réseau externe ne fonctionnait pas, car il a été supprimé de notre guide de déploiement. J'espère que ceci aide quelqu'un d'autre.
L'image nginx
que vous tirez n'a pas ping
installée par défaut. Donc, si vous utilisez vraiment ping pour tester votre connexion, vous devez d'abord l'installer.
J'ai créé un Dockerfile personnalisé pour l'installer:
FROM nginx:latest
RUN apt update && apt -y install iputils-ping
Ensuite, je l'ai construit localement et marqué comme mynginx
.
Ensuite, j'ai changé docker-compose.yml
pour utiliser l'image personnalisée mynginx
:
version: '2'
services:
nginx:
image: mynginx
Enfin, j'ai viré docker-compose up
, et a fait un docker exec dedans, et testé ping. Tout fonctionnait très bien. J'ai aussi fait docker run -ti ...
et cela a fonctionné.
Ce qui me dérange dans votre question, c'est comment docker run
peut vous donner un conteneur avec un comportement différent de celui créé par docker-compose up
.
Plus de clarté sur la façon dont vous vérifiez l'accès à Internet serait cependant utile.
Les conteneurs Docker ont la possibilité d'accéder à Internet par défaut. Voici comment j'ai résolu le problème la semaine dernière: le conteneur Docker ne peut accéder à Internet qu'avec l'hôte net
Ou vous laissez simplement le conteneur en mode hôte:
version: '2'
service:
nginx:
image: nginx
network_mode: Host
Mais comme @peedee l'a souligné dans les commentaires, cette solution perdra la séparation du réseau entre l'hôte et les conteneurs.