网络配置
TL; DR
当dockerworker开始时,它会创建一个名为虚拟接口docker0
主机上。 它随机选择从定义的私有范围内的地址和子网RFC 1918中没有的主机上使用,并分配给docker0
。 docker做出的选择172.17.42.1/16
16位掩码提供65,534地址的主机和容器-当我开始几分钟前,例如。 使用分配给该容器的IP地址,以避免冲突的ARP生成的MAC地址,使用范围从02:42:ac:11:00:00
至02:42:ac:11:ff:ff
。
注:本文介绍了先进的网络配置和选项docker。 在大多数情况下,你不需要这些信息。 如果你正在寻找上手docker网络的一个简单的解释,并介绍了容器链接的概念看到docker用户指南 。
但docker0
不是普通的接口。 这是一个虚拟以太网桥连接到它的任何其他网络接口之间自动转发数据包。 这使容器都与主机和彼此通信。 每次docker创建一个容器,它创建了一个对“同行”界面,就像是管道的两端 - 发送一个数据包上的其它将被接收。 它给同行容器成为其一个eth0
接口,并保持其他同行,具有独特的名称,比如vethAQI2QT
,在主机的命名空间。 通过结合每veth*
接口docker0
桥,docker创建虚拟子网主机和每docker容器之间共享。
这个文件的剩余部分解释一切,你可以使用docker的选择和方式 - 高级情况 - 原料Linux网络命令来调整,补充,或完全替代docker的默认网络配置。
快速指南的选项
下面是与网络有关的docker命令行选项的快速列表,如果它可以帮助你在下面找到你正在寻找的部分。
一些网络命令行选项只能提供给docker服务器启动时,一旦运行不能改变:
-
-b BRIDGE
或--bridge=BRIDGE
-看到建立自己的桥梁 -
--bip=CIDR
-见定制docker0 -
--fixed-cidr
-见定制docker0 -
--fixed-cidr-v6
-看到的IPv6 -
-H SOCKET...
或--host=SOCKET...
-这听起来像它会影响到容器的网络,但它实际上面临着在另一个方向:它告诉docker服务器通过何种渠道应该是愿意接受命令像“运行容器”和“停止容器。” -
--icc=true|false
-看到容器之间的通信 -
--ip=IP_ADDRESS
-见绑定容器港口 -
--ipv6=true|false
-看到的IPv6 -
--ip-forward=true|false
-看到容器和更广阔的世界之间的通信 -
--iptables=true|false
-看到容器之间的通信 -
--mtu=BYTES
-见定制docker0
有迹象表明,可以在启动时或可提供的两个网络选项docker run
时调用。 当在启动时提供,设置为默认值docker run
,如果没有指定的选项将在以后使用:
-
--dns=IP_ADDRESS...
-看配置DNS -
--dns-search=DOMAIN...
-看配置DNS
最后,一些网络选项只能打电话时提供docker run
,因为他们指定具体的东西一个容器:
-
-h HOSTNAME
或--hostname=HOSTNAME
-看配置DNS和如何docker网容器 -
--link=CONTAINER_NAME_or_ID:ALIAS
-看配置DNS和容器之间的通信 -
--net=bridge|none|container:NAME_or_ID|host
-看看如何docker网容器 -
--mac-address=MACADDRESS...
-看到如何docker网容器 -
-p SPEC
或--publish=SPEC
-看到绑定容器港口 -
-P
或--publish-all=true|false
-见绑定容器港口
以下各节中解决在该移动大致从最简单到最复杂的命令的所有的上述课题。
配置DNS
如何docker提供每个容器与主机名和DNS配置,而无需建立与里面写的主机名的自定义图像? 其关键是要覆盖三个重要/etc
容器与虚拟文件,它可以写入新的资料里面的文件。 您可以通过运行看到这个mount
一个容器内:
$$ mount ... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ... ...
这种安排使得docker做这样让聪明的事情resolv.conf
最新的所有容器,当主机收到了DHCP新配置后。 如何docker保持容器内,这些文件的具体细节可以改变从一个dockerworker的版本下,所以你应该离开这个文件本身单独使用以下docker选项来代替。
四种不同的选择会影响容器的域名服务。
-
-h HOSTNAME
或--hostname=HOSTNAME
-设置由容器知道自己的主机名。 此被写入/etc/hostname
,进/etc/hosts
作为容器的主机面向IP地址的名称,并且是该名称/bin/bash
容器内,将显示其内的提示。 但是,主机名是不容易从容器外面看到的。 它不会出现在docker ps
也不在/etc/hosts
任何其他容器的文件。 -
--link=CONTAINER_NAME_or_ID:ALIAS
-当你使用这个选项run
容器提供了新的容器的/etc/hosts
的额外命名条目ALIAS
指向确定容器的IP地址CONTAINER_NAME_or_ID
。 这让新的容器内的过程连接到主机ALIAS
,而不必知道它的IP。 所述--link=
选项在下文更详细讨论的,在该部分中的容器之间的通信 。 由于dockerworker可以分配不同的IP地址链接容器上重新启动,docker更新ALIAS
在入门/etc/hosts
的收件人容器的文件。 -
--dns=IP_ADDRESS...
-设置添加为IP地址server
线到容器的/etc/resolv.conf
文件。 在容器过程中,当与主机名不面对/etc/hosts
,将连接到这些IP地址,端口53寻找名称解析服务。 -
--dns-search=DOMAIN...
-设置所搜索的时候裸不合格的主机使用的容器内,通过写域名search
行到容器的/etc/resolv.conf
。 当一个容器进程试图访问host
和搜索域example.com
被设置,例如,在DNS逻辑不仅会查找host
而且host.example.com
。 使用--dns-search=.
如果你不想设置搜索域。
至于DNS设置,在没有任何的--dns=IP_ADDRESS...
或--dns-search=DOMAIN...
选项,docker使每个容器的/etc/resolv.conf
看起来像/etc/resolv.conf
(在所在主机的docker
守护程序运行)。 当创建容器的/etc/resolv.conf
,守护进程过滤掉所有的本地主机IP地址nameserver
的主机的原始文件条目。
过滤是必要的,因为在主机上的所有本地主机地址是从容器的网络不可达。 这种过滤后,如果没有更多nameserver
留在容器的条目/etc/resolv.conf
文件,守护进程增加了公共DNS谷歌域名服务器(8.8.8.8和8.8.4.4)到容器的DNS配置。 如果IPv6的对守护进程启用,市民IPv6的DNS谷歌域名服务器也将加入(2001:4860:4860 :: 8888和2001:4860:4860 :: 8844)。
注 :如果您需要访问主机的本地主机解析,您必须修改DNS服务的主机上对非本地主机地址可达从容器内听。
你可能不知道会发生什么,当主机的/etc/resolv.conf
文件的更改。 该docker
守护进程有一个文件更改通知活跃,将监视更改到主机的DNS配置。
注 :文件更改通知依靠Linux内核的inotify特性。 因为这个功能是目前覆盖文件系统驱动程序不兼容,使用docker守护“叠加”将无法利用
/etc/resolv.conf
的自动更新功能。
当主机文件的更改,停止所有容器,有一个匹配resolv.conf
到主机会立即更新到这个最新的主机配置。 这是运行时主机配置变化将需要停止并开始回升,由于缺乏设施,以确保原子写入主机改变容器resolv.conf
文件容器运行时。 如果容器的resolv.conf
已被编辑,因为它启动时使用的默认配置,无需更换会尝试,因为它会覆盖由容器进行更改。 如果该选项( --dns
或--dns-search
)已被用来修改默认主机配置,则替换更新的主机的/etc/resolv.conf
不会发生为好。
注意 :这是在执行前创建容器
/etc/resolv.conf
更新功能,在docker1.5.0:这些容器不会收到更新主机时resolv.conf
文件的更改。 只有在docker1.5.0创建及以上容器将利用这个自动更新功能。
容器和更广阔的世界之间的沟通
一个容器是否可以跟世界是由两个因素决定。
-
是主机愿意转发IP分组? 这是由管辖
ip_forward
系统参数。 包只能容器之间传递,如果这个参数是1
。 通常你会简单地离开了dockerworker的服务器的默认设置--ip-forward=true
和docker会去设置ip_forward
为1
的时候,你的服务器启动。 要检查设置或开启手动:$ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 0 $ sysctl net.ipv4.conf.all.forwarding=1 $ sysctl net.ipv4.conf.all.forwarding net.ipv4.conf.all.forwarding = 1
许多使用docker将要
ip_forward
要上,至少使容器和更广阔的世界之间的沟通成为可能 。可能还需要进行跨容器的沟通,如果你是在一个多桥设置。
-
难道你
iptables
让这个特殊的联系? docker将永远不会更改你的系统iptables
规则,如果你设置--iptables=false
,当守护程序启动。 否则,docker服务器将追加转发规则的DOCKER
过滤器链。
docker不会删除或修改任何预先存在的规则DOCKER
过滤器链。 这允许用户事先创建需要进一步限制访问容器的任何规则。
docker的转发规则允许所有的外部源IP地址在默认情况下。 仅允许一个特定的IP或网络访问的容器中,插入一个否定规则在顶部DOCKER
滤波器链。 例如,以限制外部访问,使得只有源IP 8.8.8.8可以访问的容器,以下规则可以添加:
$ iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP
.............................................
查看全文: http://mp.weixin.qq.com/s?__biz=MzAwNTA1NTY1MA==&mid=205244134&idx=1&sn=dfff7507a9b4ecf338cf6db2f23f4c39#rd