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
文章来源:https://www.toymoban.com/news/detail-791018.html
在kubernetes中,有以下4中DNS策略,可以通过dnsPolicy指定:文章来源地址https://www.toymoban.com/news/detail-791018.html
到了这里,关于Docker 容器的DNS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!