1.简介
DNS服务是域名系统的缩写, 英文全称:Domain Name System,将域名和IP地址相互映射。在容器环境中,DNS至关重要,
Docker link
Docker link是一个遗留的特性,在新版本的Docker中,一般不推荐使用。简单来说Docker link就是把两个容器连接起来,容器可以使用容器名进行通信,而不需要依赖ip地址(其实就是在容器的/etc/hosts文件添加了host记录,原本容器之间的IP就是通的,只是我们增加了host记录,可以不用IP去访问)
创建容器centos-1:
[root@host1 ~]# docker run -itd --name centos-1 registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2
创建容器centos-2,使用--link name:alias,name就是要访问的目标机器,alias就是自定义的别名。
[root@host1 ~]# docker run -itd --name centos-2 --link centos-1:centos-1-alias registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2
查看容器centos-2的/etc/hosts文件:
[root@host1 ~]# docker exec centos-2 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.18.0.2 centos-1-alias 9dde6339057a centos-1 #容器centos-1的host记录 172.18.0.3 f1a7e5fa3d96 #容器centos-2自身的host记录
意味着centos-2可以用centos-1-alias,9dde6339057a,centos-1来访问原先创建的容器。centos-1是不可以通过hostname访问centos-2的。
[root@host1 ~]# docker exec centos-2 ping centos-1-alias PING centos-1-alias (172.18.0.2) 56(84) bytes of data. 64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=0.174 ms ^C [root@host1 ~]# docker exec centos-2 ping centos-1 PING centos-1-alias (172.18.0.2) 56(84) bytes of data. 64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=1.37 ms 64 bytes from centos-1-alias (172.18.0.2): icmp_seq=2 ttl=64 time=0.523 ms ^C [root@host1 ~]# docker exec centos-2 ping 9dde6339057a PING centos-1-alias (172.18.0.2) 56(84) bytes of data. 64 bytes from centos-1-alias (172.18.0.2): icmp_seq=1 ttl=64 time=2.59 ms 64 bytes from centos-1-alias (172.18.0.2): icmp_seq=2 ttl=64 time=3.75 ms
Embedded DNS
从Docker 1.10开始,Docker提供了一个内置的DNS服务器,当创建的容器属于自定义网络时,容器的/etc/resolv.conf会使用内置的DNS服务器(地址永远是127.0.0.11)来解析相同自定义网络内的其他容器。
为了向后兼容,default bridge网络的DNS配置没有改变,默认的docker网络使用的是宿主机的/etc/resolv.conf的配置。
创建一个自定义网络:
[root@host1 ~]# docker network create my-network #bridge,host,none为docker默认创建的网络 [root@host1 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2115f17cd9d0 bridge bridge local 19accfa096cf host host local a23c8b371c7f my-network bridge local 0a33edc20fae none null local
分别创建两个容器属于自定义网络my-network中:
[root@host1 ~]# docker run -itd --name centos-3 --net my-network registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2 [root@host1 ~]# docker run -itd --name centos-4 --net my-network registry.cn-shanghai.aliyuncs.com/public-namespace/cr7-centos7-tool:v2
查看容器centos-4的/etc/hosts和/etc/resolv.conf,可以看到nameserver添加的IP为127.0.0.11的Embedded DNS:
#/etc/hosts中没有配置对方的host记录 [root@host1 ~]# docker exec centos-4 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.19.0.3 555281f37ea3 #/etc/resolv.conf配置了dns服务器127.0.0.11 [root@host1 ~]# docker exec centos-4 cat /etc/resolv.conf nameserver 127.0.0.11 options ndots:0
此时centos-3和centos-4可以互相解析:
[root@host1 ~]# docker exec centos-4 ping centos-3 PING centos-3 (172.19.0.2) 56(84) bytes of data. 64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=1 ttl=64 time=0.128 ms 64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=2 ttl=64 time=0.078 ms 64 bytes from centos-3.my-network (172.19.0.2): icmp_seq=3 ttl=64 time=0.103 ms ^C [root@host1 ~]# docker exec centos-3 ping centos-4 PING centos-4 (172.19.0.3) 56(84) bytes of data. 64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=1 ttl=64 time=0.087 ms 64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=2 ttl=64 time=0.101 ms 64 bytes from centos-4.my-network (172.19.0.3): icmp_seq=3 ttl=64 time=0.076 ms ^C
Docker DNS配置
方式一:docker run (针对单个容器)
Flag | Description |
--dns | 指定DNS服务器地址,如果容器不能访问指定的所有ip地址,则会使用8.8.8.8作为DNS服务器地址(Docker默认定义的) |
--dns-search | 当容器访问一个不包括完全域名的主机名时,在该主机名后面添加dns-search指定的域名后缀,例如容器访问centos-1,dns-search配置的是example.com,则会解析成centos-1.example.com |
--dns-opt | options ndots:5的含义是当查询的域名字符串内的点字符数量大于等于ndots值(5)时,则认为是完整域名,直接解析,不会走 search 域 |
--hostname | 指定容器hostname |
方式二:daemon.json
nameserver只针对docker默认网络所有容器,dns-search和dns-opts针对所有网络容器。
{ "dns": ["114.114.114.114","223.5.5.5"], "dns-opts":["ndots:5"], "dns-search":["example.com"] }
Kubernetes DNS
在kubernetes中,有以下4中DNS策略,可以通过dnsPolicy指定: