web-dev-qa-db-fra.com

pas d'internet dans le service docker-compose

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"]
}
27
orshachar

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.

5
peedee

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.

3
cornernote

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.

0
Bruno Borges

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.

0
Gao Shenghan