本文版本Docker version 1.12.6

相关文章:

《Linux 虚拟网络设备 veth-pair》 linux基础
《Linux虚拟网络设备之veth(arp incomplete)》

Docker网络(veth、网桥、host、container、none) docker上网络概述

Docker的网络配置 1 初识 docker 精讲
Docker的网络配置 2 配置 DNS和主机名
Docker的网络配置 3 user-defined网络
Docker的网络配置 4 内嵌的DNS server
Docker的网络配置 5 将容器与外部世界连接
Docker的网络配置 6 docker-proxy

内置DNS服务

通过IP访问容器虽然满足多了通信的需求,但是还不够灵活。因为在部署应用前可能无法确定IP,部署后再指定要访问的IP会比较麻烦。对于这个问题,可以通过docker自带的DNS服务解决。

Docker 1.10版本开始,docker daemon实现了一个内嵌的DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动时用--name 为容器命名就可以了。

创建的容器满足以下条件时:

  • 使用自定义网络;
  • 容器创建时候通过 --name, --network-alias or --link提供了一个name;

注意:使用docker DNS有个限制:只能在user-defined网络中使用

下面验证一下:

我们引用Docker的网络配置 3 user-defined网络中的环境

容器id 容器名称 --network --ip
644cc15c850f kubia-container3 my_net2 172.21.0.100
1bc6625fcf0b kubia-container4 my_net2 172.21.0.101
f4a9983fb72c kubia-container docker0(默认) 172.17.0.9(自动分配的)

存在3个容器,kubia-container3和kubia-container4是user-defined创建的,kubia-container是默认创建的。

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# ping kubia-container4
PING kubia-container4 (172.21.0.101) 56(84) bytes of data.
64 bytes from kubia-container4.my_net2 (172.21.0.101): icmp_seq=1 ttl=64 time=0.189 ms
64 bytes from kubia-container4.my_net2 (172.21.0.101): icmp_seq=2 ttl=64 time=0.096 ms
^C
--- kubia-container4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.096/0.142/0.189/0.048 ms
# ping kubia-container
ping: kubia-container: Name or service not known

我们进入kubia-container3容器,直接ping kubia-container4,可以平通,但是ping kubia-container拼不同,说明user-defined网络才能识别。

探究内置的DNS

Options Description
--name=CONTAINER-NAME 在该容器启动时,会将CONTAINER-NAME和该容器的IP配置到该容器连接到的自定义网络中的内置 DNS server中,内置的DNS服务器维护容器名称与它的IP地址的映射关系,由它提供该自定义网络范围内的域名解析
--network-alias=ALIAS 将容器的name-ip map配置到容器连接到的其他网络的内置 DNS server中。PS:一个容器可能连接到多个网络中。
docker network connect命令的 --alias
--link=CONTAINER_NAME:ALIAS 这选项会在创建容器的时候添加一个其他容器CONTAINE_NAME的主机名到/etc/hosts文件中, 让新容器的进程可以使用主机名ALIAS就可以连接它
--dns=[IP_ADDRESS…]
可以支持多个IP
当内置DNS server无法解析该容器的某个dns query时,会将请求foward到这些 --dns配置的IP_ADDRESS DNS Server,由它们进一步进行域名解析。注意,这些 --dns配置到nameserver IP_ADDRESS全部由对应的embedded DNS server管理,并不会更新到容器内的/etc/resolv.conf
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com
--dns-opt=OPTION… 在该容器启动时,会将–dns-opt配置的OPTION们配置到the embedded DNS server

说明:

1 如果docker run时不含 --dns=IP_ADDRESS…, --dns-search=DOMAIN…, or --dns-opt=OPTION…参数,docker daemon会将copy本主机的/etc/resolv.conf,然后对该copy进行处理(将那些/etc/resolv.conf中ping不通的nameserver项给抛弃),处理完成后留下的部分就作为该容器内部的/etc/resolv.conf。因此,如果你想利用宿主机中的/etc/resolv.conf配置的nameserver进行域名解析,那么你需要在宿主机中该dns service配置一个宿主机内容器能ping通的IP。
2 注意容器内/etc/resolv.conf中配置的DNS server,只有当内置DNS server无法解析某个name时,才会用到。

基于上述零碎的表格的知识,我们来说总结下dns的顺序

Docker容器实例中解析DNS的顺序

  1. 查找Docker daemon内置的DNS服务器127.0.0.11

  2. 查找docker run创建容器实例时通过 --dns参数(容器定制)设置的DNS服务器

  3. 查找Docker daemon通过 --dns参数,或/etc/docker/daemon.json(容器通用设置)文件设置的DNS服务器

  4. 查找Docker宿主机上/etc/resolv.conf文件中配置的DNS服务器

  5. 最后,查找Google的DNS服务器,如8.8.8.8和8.8.4.4,2001:4860:4860::8888和2001:4860:4860::8844

简单来说,就是由近及远原则,内置服务器优先级最高,其次容器定制的,再其次容器通用的,最后是主机的dns。

回顾前面的例子

基于上述理论,我们分别看下kubia-container和kubia-container3的dns配置。首先我们知道dns配置在容器的/etc/resolv.conf中,那么我们来看看配置的内容。

kubia-container是默认docker0 且参数都是默认创建的
docker run --name kubia-container -p 8080:8080 -d docker.artnj.test.com.cn/cci/kubia:v3

进入容器,查看dns设置,其实是主机的/etc/resolv.conf一致

[root@EMS3 ~]# docker exec -it kubia-container sh
# cat /etc/resolv.conf
# Generated by NetworkManager
search openstacklocal
#nameserver 192.101.0.1
#nameserver 192.102.0.1
nameserver 10.40.8.8
nameserver 10.30.8.8

kubia-container3是user-defined网络创建的,内置dns,127.0.0.11,果然是当使用自定义网络时,就不再拷贝主机的/etc/resolv.conf文件了。

[root@EMS3 ~]# docker exec -it kubia-container3 sh
# cat /etc/resolv.conf
search openstacklocal
nameserver 127.0.0.11
options ndots:0

Docker的网络配置 4 内嵌的DNS server相关推荐

  1. ArchLinux(2013)中的网络配置和静态IP时DNS刷新的解决方法

    ArchLinux(2013)中的网络配置和静态IP时DNS刷新的解决方法 参考文章: (1)ArchLinux(2013)中的网络配置和静态IP时DNS刷新的解决方法 (2)https://www. ...

  2. Docker的网络配置:创建网桥

    Table of Contents 环境 介绍 关于命名空间 关于Veth对 建立我自己的Docker网络 里程碑1:主机内Ping 里程碑2:通过主机NAT进行外部访问 里程碑3:从主机到远程容器的 ...

  3. docker之网络配置

    目录 前言 网络配置的概念 1.bridge网络模式 2.HOST网络模式 3.container模式和none模式 4.测试bridge和host模式的区别 项目导出成jar包并上传到宿主机(Eru ...

  4. docker高级网络配置、高级数据卷机制和Dockerfile说明

    11.高级网络配置 11.1 说明 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂载到它的网 ...

  5. docker容器网络配置之容器间的链接(默认桥接网络下的links)

    一. 遗留的容器连接方式  --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...

  6. virtualbox虚拟机网络配置实现内网外网互通

    实验环境如下: virtualbox上运行的虚拟机:windows 2008 en 实体机IP:192.168.10.88 内网段:192.168.18.X 实体机:windows 10 virtua ...

  7. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  8. docker的网络架构配置

    http://xiaorenwutest.blog.51cto.com                  docker 网络架构模 默认情况下,容器可以建立到外部网络的连接,但是外部网络无法连接到容器 ...

  9. docker内外连通ros_docker容器内的ros外设使用与远程配置

    docker下ros外设使用与远程配置 ros远程配置 假设条件 docker容器网络配置 docker 容器ros网络配置 主机A的ros网络配置 网络永久配置 ros远程配置 假设条件 A电脑中安 ...

最新文章

  1. 我对于js注入的理解
  2. 【转载】Linux常用命令1
  3. string类assign方法
  4. wxWidgets:构建wxWidgets程序的第一步
  5. 数据库有哪些设计技巧
  6. 解决Ubuntu14.04在外接显示器不能指定问题的最佳分辨率
  7. IAR切BANK--程序中的使用
  8. 循环上传导致oom_java之OOM排查
  9. 别双击闪存盘 惊醒病毒就不得了
  10. POJ3979 分数加减法【水题】
  11. js去空格、去重函数
  12. PR视频旋转处理方法
  13. 中维高清监控录像被覆盖故障排除
  14. 超越GraphCL,GNN+对比学习的节点分类新SOTA
  15. CSDN怎么自动生成目录
  16. 《奇葩说》救猫还是救画,我做了认真的分析
  17. UE4 pak 热加载
  18. 图像超分之——寻找两张图差异的区域
  19. 用Python写爬虫代码,记录斗鱼主播的热度变化情况,并绘制热度变化图。
  20. element上传图片校验尺寸

热门文章

  1. 用直播的钱反哺社交,陌陌未来的故事是小腾讯
  2. 京东获取cookie教程
  3. SAP-库存管理-预留
  4. SQL查询去掉重复数据
  5. c语言实现伽罗华域乘法器,伽罗华域运算及C语言实现
  6. ubuntu14.04安装GTX 1080 ti遇到黑屏问题
  7. 管螺纹如何标注_老师!请问这种螺纹孔怎么标注啊??机械设计教程螺纹知识教学!...
  8. 虚拟专用网技术VPN
  9. MapReduce--12--学生成绩(增强版)--需求1
  10. ILRuntime使用指南