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
Credits to tgogos: I just had to use the non-default bridge.
For completeness, here is my working config.
And the ping now works.
delete this
network_mode: bridge
from your compose file, worked for me =).Another solution I tried and worked was explicitly linking the containing you want to ping with host name. For example, I have a
postgres
container, and aserver
wants to connect to it.Run the
server
with the followingIn the server container environment, you can then ping with (given
postgres
is on the same bridge/network and is running)Since
--link
has been deprecated, it is recommended to use network bridge.then the two containers can ping each other by name.