Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I ping other containers in a docker network through their hostname?

I have a simple docker-compose set up as follows.

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

If I run and try to ping the other container, I get the following output.

$ 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

If I search up the ip address of the containers through docker network inspect bridge, I can use that to ping as follows.

$ 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

However, I want to do the same thing through the hostname of the containers. My docker, docker-compose, and OS versions are as follows.

$ 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
like image 445
Kent Shikama Avatar asked Jan 22 '18 10:01

Kent Shikama


People also ask

How do you communicate between docker containers via hostname?

When you connect an existing container to a different network using docker network connect , you can use the --ip or --ip6 flags on that command to specify the container's IP address on the additional network. In the same way, a container's hostname defaults to be the container's ID in Docker.

Can docker containers communicate with the host?

If you are running more than one container, you can let your containers communicate with each other by attaching them to the same network. Docker creates virtual networks which let your containers talk to each other. In a network, a container has an IP address, and optionally a hostname.


1 Answers

Credits to tgogos: I just had to use the non-default bridge.

For completeness, here is my working config.

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

And the ping now works.

$ 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
like image 61
Kent Shikama Avatar answered Sep 27 '22 21:09

Kent Shikama