web-dev-qa-db-fra.com

Comment envoyer une requête ping à d'autres conteneurs d'un réseau docker via leur nom d'hôte?

J'ai un simple docker-compose mis en place comme suit.

version: "3"
services:
  main:
    image: python:3.5.2
    entrypoint: /usr/bin/yes
    network_mode: bridge

  another:
    image: python:3.5.2
    entrypoint: /usr/bin/yes
    network_mode: bridge

Si j'exécute et essaie d'envoyer une requête ping à l'autre conteneur, j'obtiens la sortie suivante.

$ docker-compose up -d
Recreating dockerplayground_main_1 ... 
Recreating dockerplayground_another_1 ... done
$ docker-compose ps
           Name                Command      State   Ports
---------------------------------------------------------
dockerplayground_another_1   /usr/bin/yes   Up           
dockerplayground_main_1      /usr/bin/yes   Up           
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3b256d98bf2c        python:3.5.2        "/usr/bin/yes"      7 seconds ago       Up 6 seconds                            dockerplayground_another_1
dfc04a452547        python:3.5.2        "/usr/bin/yes"      7 seconds ago       Up 6 seconds                            dockerplayground_main_1
$ docker exec -it 3b256d98bf2c ping dfc04a452547
ping: unknown Host
$ docker exec -it 3b256d98bf2c ping main
ping: unknown Host
$ docker exec -it 3b256d98bf2c ping another
ping: unknown Host
$ docker exec -it 3b256d98bf2c ping dockerplayground_another_1
ping: unknown Host
$ docker exec -it 3b256d98bf2c ping dockerplayground_main_1
ping: unknown Host

Si je recherche l'adresse IP des conteneurs via docker network inspect bridge, Je peux l'utiliser pour faire un ping comme suit.

$ docker exec -it 3b256d98bf2c ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.076 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.046 ms

Cependant, je veux faire la même chose via le nom d'hôte des conteneurs. Mes versions Docker, Docker-compose et OS sont les suivantes.

$ docker --version
Docker version 17.12.0-ce, build c97c6d6

$ docker-compose --version
docker-compose version 1.18.0, build 8dd22a9
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.3 LTS
Release:        16.04
Codename:       xenial
7
Kent Shikama

Crédits aux tgogos: je devais juste utiliser le pont non par défaut.

Pour être complet, voici ma configuration de travail.

version: "3"
services:
  main:
    networks:
      test:
    image: python:3.5.2
    entrypoint: /usr/bin/yes

  another:
    networks:
      test:
    image: python:3.5.2
    entrypoint: /usr/bin/yes


networks:
  test:
    driver: bridge

Et le ping fonctionne maintenant.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
faa9f96d46a9        python:3.5.2        "/usr/bin/yes"      9 seconds ago       Up 9 seconds                            dockerplayground_main_1
5b2d56ac0cd7        python:3.5.2        "/usr/bin/yes"      9 seconds ago       Up 8 seconds                            dockerplayground_another_1
$ docker exec -it faa ping another
PING another (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.054 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.066 ms
9
Kent Shikama

supprime ça network_mode: bridge à partir de votre fichier de composition, a fonctionné pour moi =).

5
Kilian

Une autre solution que j'ai essayée et travaillée était de lier explicitement le conteneur que vous souhaitez envoyer au ping avec le nom d'hôte. Par exemple, j'ai un conteneur postgres et un server veut s'y connecter.

Exécutez le server avec ce qui suit

docker run --name server --link postgres someserver:latest

Dans l'environnement de conteneur de serveur, vous pouvez ensuite exécuter une commande ping avec (étant donné que postgres se trouve sur le même pont/réseau et est en cours d'exécution)

ping postgres 

Puisque --link est obsolète, il est recommandé d'utiliser un pont réseau.

docker network create YOURNETWORK
docker run --name postgres --network='YOURNETWORK' postgres:latest
docker run --name server --network='YOURNETWORK' server:latest

alors les deux conteneurs peuvent se cingler par leur nom.

0
HarryQ