docker内置dnsserver工作机制


环境

测试环境为docker社区版本17.03。


docker容器的网络命名空间默认无法通过ip netns命令查询到,因此有两种办法。都需要通过docker inspect -f "{{.State.Pid}}" <container_id>找到容器的初始进程开始。
  1. 通过ln -s /proc/<pid>/ns/net /var/run/ns/<container_id>,将命名空间暴漏在ip netns下,继续后续操作。本文就采用这种办法,好处就是可以利用容器中没有而主机上有的命令行。
  2. 通过nsenter –target <pid> –mount –uts –ipc –net –pid进入容器命名空间,再执行操作。

原理介绍

容器的dns解析顺序

容器中的DNS名称解析优先级顺序为:
  • ​ 内置DNS服务器127.0.0.11。
  • ​ 通过--dns等参数为容器配置的DNS服务器。
  • ​ docker守护进程的--dns服务配置(默认为8.8.8.8和8.8.4.4)
  • ​ 宿主机上的DNS设置。


docker dns server工作机制

1)一般情况下,使用docker网络的容器的dns服务器是127.0.0.11。如下图所示:

container_dns_ip.png

2)通过命令查看容器内的iptables规则。如下图所示:

container_dns_iptables.png

可以发现到127.0.0.11的53端口的dns请求,被转发到了43747端口。那么这个端口是被什么程序监听的呢?

3)在容器的网络命令空间中,可以通过命令netstat -ntlp查到监听这个端口的程序,如下图所示:

container_dns_daemon.png

docker containerd进程上了,它会向内部存储做查询,返回dns的查询结果。

如果容器中有netstat命令行,由于进程空间隔离的原因,直接在容器中查询监听端口时,会出现对应进程为-的输出,只能在主机上执行才可以。

3 个评论

&quot
<
这些啥意思啊。
引号(“)和小于号(<)
比较奇怪,写好预览的时候是好的,发布就乱了(/ □ \)

要回复文章请先登录注册