web-dev-qa-db-ja.com

ホスト名を使用して、Dockerネットワーク内の他のコンテナにpingを実行するにはどうすればよいですか?

次のようにセットアップされた単純なdocker-composeがあります。

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

実行して他のコンテナーをpingしようとすると、次の出力が表示されます。

$ 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

docker network inspect bridgeを使用してコンテナのIPアドレスを検索すると、次のようにpingに使用できます。

$ 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

ただし、コンテナのホスト名を使用して同じことを行いたいと思います。私のdocker、docker-compose、およびOSのバージョンは次のとおりです。

$ 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

Tgogosの功績:デフォルト以外のブリッジを使用する必要がありました。

完全を期すために、ここに私の作業構成を示します。

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

そして、pingが機能するようになりました。

$ 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

これを削除network_mode: bridge作成ファイルから、私のために働いた=)。

5
Kilian

私が試し、働いた別の解決策は、pingを実行するコンテナをホスト名と明示的にリンクすることでした。たとえば、postgresコンテナがあり、serverがそれに接続したい。

次のserverを実行します

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

サーバーコンテナー環境では、pingを実行できます(postgresが同じブリッジ/ネットワーク上にあり、実行されている場合)

ping postgres 

--linkは廃止されました。ネットワークブリッジを使用することをお勧めします。

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

その後、2つのコンテナーは名前で相互にpingを実行できます。

0
HarryQ