簡單說一下流程吧,不寫了。
docker會修改容器里的/etc/resolv.conf文件,把dns服務器設置成127.0.0.11,因為127.0.0.0/8地址都是本機回環地址,所以dns查詢的時候實際上是把請求發給了自己。雖然是發給自己,但是還是要走netfilter表的。nat表的output鏈里把發往127.0.0.11:53的UDP包轉到了41741端口
iptables -A DOCKER_OUTPUT -d 127.0.0.11/32 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.11:41741
netstat -anp查看發現是dockerd在監聽41741端口,等dns請求又回環到filter表的input鏈的時候dockerd就接到了這個請求。所以,輾轉了半天dns請求最終發給了dockerd進程。dockerd自身處理這些請求,處理不了的應該是要發給宿主機的dns服務器。
參考:
https://docs.docker.com/v17.09/engine/userguide/networking/configure-dns/
https://www.jianshu.com/p/4433f4c70cf0
https://anoyi.com/p/dba9342071d8
