結論
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