사용자 생성 bridge network 이용 시, container 이름을 통한 DNS resolution이 되지 않는 현상
Created 2022-03-11
Problem
사용자 정의 bridge network는 해당 네트워크에 속한 container 사이에 DNS resolution을 제공하기 때문에 IP가 아닌 container 이름을 통해 접근할 수 있다. 이와 관련해 실제 container 이름을 통해 DNS reolustion이 되는지 테스트를 진해앴으며 예외 케이스가 발생했다.
bridge network에 대한 설명은 아래 Docker documentation을 참고한다.
정상적인 테스트 케이스는 아래와 같다.
사용자 정의 bridge network 생성 및 조회
# test 이름을 갖는 bridge network 생성$dockernetworkcreate-dbridgetesta23414a0e7620943a4335fde5ed15c1bd9cfd41be4f81ab44b8d27f0ff268185# test network 조회$dockernetworkinspecttest[ {"Name": "test","Id": "a23414a0e7620943a4335fde5ed15c1bd9cfd41be4f81ab44b8d27f0ff268185","Created": "2022-03-11T10:25:21.362459215+09:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [ {"Subnet": "192.168.96.0/20","Gateway": "192.168.96.1" } ] },"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": "" },"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {} }]
# container_2 attach$dockerattachcontainer_2# DNS 목록 조회/ \# cat/etc/resolv.confnameserver127.0.0.11optionsndots:0# ping 테스트/ \# pingcontainer_1-c3PINGcontainer_1 (192.168.96.2): 56 data bytes64bytesfrom192.168.96.2:seq=0ttl=64time=0.122ms64bytesfrom192.168.96.2:seq=1ttl=64time=0.159ms64bytesfrom192.168.96.2:seq=2ttl=64time=0.139ms---container_1pingstatistics---3packetstransmitted,3packetsreceived,0%packetlossround-tripmin/avg/max=0.122/0.140/0.159ms# container_1 이름에 대한 DNS resolution 확인/ \# nslookupcontainer_1Server:127.0.0.11Address:127.0.0.11:53Non-authoritativeanswer:Name:container_1Address:192.168.96.2Non-authoritativeanswer:
위 테스트처럼 사용자 정의 bridge network에 속한 container의 경우 docker 내부 DNS 서버(127.0.0.1)를 통해 container 이름을 통한 DNS resolution이 가능하다.
에외 발생 케이스는 아래와 같다.
사용자 정의 bridge network 생성 및 조회(코드 생략)
이름을 지정한 container_2 container와 이름을 지정하지 않은 container 생성
# 이름 명시하지 않은 container 생성$dockerrun--rm-tid--networktestalpine1b2bcded83671013f5274de2aea072e343877bd9590ad70c9e7315a865e99b1f# 이름 조회$dockerps--filterid=1b2bcded83671CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES1b2bcded8367alpine"/bin/sh"2minutesagoUp2minutesunruffled_stonebraker# container_2 생성$dockerrun--rm-tid--networktest--namecontainer_2alpine9359704cdc048b2c4cb0d1217c9d1fd985ed3f4986114648003a3f4783e4b289
test bridge network에 위에서 생성한 2개의 container가 연결되어있는지 확인
# container_2 attach$dockerattachcontainer_2# DNS 목록 조회/ \# cat/etc/resolv.confnameserver127.0.0.11optionsndots:0# container 이름 ping 테스트/ \# pingunruffled_stonebrakerping:badaddress'unruffled_stonebraker'# container ip ping 테스트/ \# ping192.168.96.2-c2PING192.168.96.2 (192.168.96.2): 56 data bytes64bytesfrom192.168.96.2:seq=0ttl=64time=0.131ms64bytesfrom192.168.96.2:seq=1ttl=64time=0.101ms---192.168.96.2pingstatistics---2packetstransmitted,2packetsreceived,0%packetlossround-tripmin/avg/max=0.101/0.116/0.131ms# unruffled_stonebraker 이름에 대한 DNS resolution 확인/ \# nslookupunruffled_stonebrakerServer:127.0.0.11Address:127.0.0.11:53** server can't find unruffled_stonebraker: NXDOMAIN** server can't find unruffled_stonebraker: NXDOMAIN
정상 케이스와 다르게 이름을 명시하지 않은 container는 DNS resolution이 되지 않는다(IP를 통한 ping 테스트는 정상).