コンテナ名でコンテナ間通信したい場合は、ネットワークブリッジを新たに作成するべし

  • 投稿者:
  • 投稿カテゴリー:docker

結論

docker run の際に network を指定しなければ、デフォルトのネットワークブリッジが利用され、コンテナ名は名前解決できない。
(IPアドレスでコンテナ間通信は可能)
コンテナ名でコンテナ間通信したい場合は、ネットワークブリッジを新たに作成して、docker run の際に指定すること。
そうすることでコンテナが内部DNSサーバ(127.0.0.11)を利用するため、コンテナ名の名前解決が可能となる。

デフォルトのネットワークブリッジを利用する場合

デフォルトで bridge が利用される。alpineを起動するとdockerホストと同じDNSサーバが指定されるため、コンテナ名は名前解決できない。

# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4a91590dd285   bridge    bridge    local
c34d47cfe560   host      host      local
f327d234d944   none      null      local

# docker run -it alpine /bin/sh

/ # cat /etc/resolv.conf
nameserver 210.188.224.10
nameserver 210.188.224.11
search localdomain

自作のネットワークブリッジを利用する場合

n0を作成して利用すると、DNSサーバは内部DNSサーバ(127.0.0.11)を利用しており、コンテナ名を名前解決している。

# docker network create n0
# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4a91590dd285   bridge    bridge    local
c34d47cfe560   host      host      local
b514e2c38fb3   n0        bridge    local
f327d234d944   none      null      local

# docker run -itd --name test1 --network n0 alpine /bin/sh
# docker run -it --name test2 --network n0 alpine /bin/sh

/ # cat /etc/resolv.conf
search localdomain
nameserver 127.0.0.11
options edns0 ndots:0

/ # nslookup -type=A test1 127.0.0.11
Server:         127.0.0.11
Address:        127.0.0.11:53

Non-authoritative answer:
Name:   test1
Address: 192.168.2.2

# ping -c 1 test1
PING test1 (192.168.2.2): 56 data bytes
64 bytes from 192.168.2.2: seq=0 ttl=64 time=0.120 ms