Docker 容器的DNS

本文涉及的产品
.cn 域名,1个 12个月
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: Docker 容器的DNS

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指定:

相关文章
|
5天前
|
Web App开发 iOS开发 Docker
Docker 容器的日志
【10月更文挑战第31天】
16 5
|
4天前
|
存储 Kubernetes C++
Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
随着容器技术的快速发展,容器编排工具成为了现代软件开发和运维的重要环节。在众多容器编排工具中,Kubernetes和Docker Swarm无疑是最受欢迎的两个。本文将从技术特性、易用性和社区支持三个方面,对Kubernetes和Docker Swarm进行比较,以帮助您选择更适合您需求的容器编排工具。
17 3
|
5天前
|
存储 缓存 Docker
docker中挂载数据卷到容器
【10月更文挑战第16天】
15 2
|
7天前
|
缓存 前端开发 JavaScript
前端的全栈之路Meteor篇(二):容器化开发环境下的meteor工程架构解析
本文详细介绍了使用Docker创建Meteor项目的准备工作与步骤,解析了容器化Meteor项目的目录结构,包括工程准备、环境配置、容器启动及项目架构分析。提供了最佳实践建议,适合初学者参考学习。项目代码已托管至GitCode,方便读者实践与交流。
|
6天前
|
存储 关系型数据库 MySQL
|
7天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第13天】
13 2
|
8天前
|
运维 监控 数据可视化
Docker容器可视化管理工具 - WGCLOUD基础介绍
WGCLOUD是新一代运维监测平台,它可以监控Docker容器的各种性能数据,比如内存,cpu,Image,运行时间,运行状态,端口映射等信息
|
9天前
|
Ubuntu Shell 开发者
Docker入门:轻松开始容器化之旅
【10月更文挑战第17天】Docker 是一种开源的应用容器引擎,它让开发者能够“一次构建、到处运行”。Docker 通过容器化技术将应用程序及其依赖打包在一起,从而确保应用在任何环境中都能一致地运行。本文将为新手用户提供一个全面的Docker入门指南,包括基本概念、优势、安装配置以及如何创建和管理容器。
29 2
|
10天前
|
存储 Kubernetes 监控
深入探索Docker容器化技术的奥秘
【10月更文挑战第15天】深入探索Docker容器化技术的奥秘
16 0
|
11天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
32 5