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
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
supprime ça network_mode: bridge
à partir de votre fichier de composition, a fonctionné pour moi =).
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.