网络启动与配置参数
docker启动的时候会在主机上自动创建一个docker0虚拟网桥,实际上是一个linux网桥,它会在挂载其上的借口之间进行转发
同时,docker随机分配一个本地未占用的私有网段中的一个地址给docker接口,掩码为255.255.0.0 且启动的容器内的网口也会分配一个同一网段的地址172.17.0.0/16
当我们创建一个docker容器的时候,同是也会创建一对veth pair 接口,这对接口一端在容器内,即eth0,另一端被挂载到docker0网桥,名称 以veth开头,通过这种方式,主机可以跟容器通信,容器之间也可以相互通信,这样一来,docker就创建了在主机和容器之间一个虚拟共享网络。
其中的ip和子网掩码以及MTU(接口允许接受的最大的传输单元),这些值都可以在服务启动的时候进行配置
–bip=CIDR 例如:192.168.1.5/24
–mtu=BYTES 覆盖默认的mtu值
也可以在配置文件中配置DOCKER_OPTS,然后重启服务
用户可以通过 brctl show 来查看网桥和端口连接信息(brctl 系统如果没有自带可以使用 yum install bridge-utils 进行安装)
[root@localhost default]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242b7e1285f no vethc908ea6
virbr0 8000.525400afcadd yes virbr0-nic
目前 docker 不支持在启动容器的时候指定IP地址
linux的网桥功能已经十分完善,但是可以通过替换为OpenvSwitch等功能更强大的网桥实现
除了默认的docker0网桥,用户也可以制动网桥来连接各个容器
在启动docker服务的时候,使用-b 或者是 –bridge 来指定使用的网桥
关于如何自定义网桥:http://blog.youkuaiyun.com/xitongfengxi/article/details/52249988
配置容器DNS和主机名
docker支持自定义容器的主机名和dns配置
容器中的主机名和dns都是通过三个配置文件来进行维护的
/etc/resolv.conf /etc/hostname /etc/hosts
启动容器的的时候 可以通过 #:mount 命令看到三个文件的挂载信息
其中,/etc/resolv.conf 文件在创建容器的时候,默认会与宿主机中的/etc/resolv.conf文件保持一致
修改配置文件
如果要修改上面三个配置文件,那么这些修改只是临时的,只在运行的容器中保留,当容器终止或者重启后并不会被保留下来,也不会被 docker commit 提交
可以在创建或者启动容器的时候使用下面的参数来自定义容器的配置
- -h 指定主机名,这个主机名只能在容器内部看到
- -link= 添加一个所连接容器的名到容器内
- –dns= 添加DNS服务器
- –dns-search= 指定dns搜索域
容器访问控制
容器的访问控制主要通过linux上的iptables防火墙软件来进行管理和实现的
1、容器访问外部网络
容器默认情况下是可以访问到宿主机本地的,容器要是想通过宿主机访问到外部网络,需要宿主机进行转发
在宿主机linux系统检查转发是否打开:
[root@localhost ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果值为0,则说明没有开启转发,需要手动打开
sysctl -w net.ipv4.ip_forward=1
或者在启动容器服务的时候设定 –ip-forward=true 打开宿主机的转发服务
2、容器之间的访问
容器之间的访问需要两方面的支持:
网络拓扑是否已经联通,因为默认情况下,所有容器都会连接到docker0网桥上,所以拓扑是互通的
本地系统防火墙软件是否允许访问通过,大部分情况下是允许的
(1)访问所有端口
默认情况下载启动docker 服务的时候,会添加一条参数 -icc=true 允许装发策略到iptables的FORWARD
但是为了安全考虑,可以在Docker配置文件中配置DOCKER_OPTS=–icc=false 来默认进制容器之间的相互访问
(2)访问指定㐰
在通过-icc=false 禁止容器间相互访问后,仍可以通过–link=CONTAINER_NAME:ALIAS选项来允许访问指定容器的开放端口
比如,在启动docker 服务时,可以同时使用 icc=false –iptables==true参数来配置容器间禁止访问,并允许docker自动修改系统中的iptables规则
系统中的iptables规则可能是类似如下的规则,禁止所有转发流量
之后,启动容器时,使用–link=CONTAINER_NAME:ALIAS选项,docker 会在iptable中为两个互联容器分别添加一条ACCEPT规则,允许相互访问开放端口
外部访问容器实现
容器允许外部访问,可以在启动容器的时候使用-P或-p参数来启用
原理是在本地的iptable的nat表中添加相应的规则,将访问外部ip地址的网包进行目标地址DNAT,将目标地址修改为容器的IP地址
下面以一个开放80端口的例子,使用-P时,会自动的映射本地一定范围内的端口随机端口到容器的80端口
可以看到nat表中涉及两条链,PREROUTING链负责包到达网络接口时,改写其目的地址,其中规则将所有流量都扔到DOCKER链中,而DOCKER链中将所有不是从docker0进来的网包,将目标端口为32768的,修改目标地址为172.17.0.2,目标 端口修改为80
使用-p 80:80时,跟上面类似,但是将本地的80端口映射到容器中的80端口
这里有两点需要注意:
1、这里的规则映射了0.0.0.0,也就意味着容器将接受任意网络的访问,用户可以通过-p IP::port 来绑定外部的网络接口,指定严格的访问规则
2、也可以永久绑定到某个固定的IP地址,可以在Docker配置文件/etc/default/docker中 指定DOCKER_OPTS=”–ip=IP_ADDRESS”,之后重启Docker服务即可生效