容器的访问控制主要通过Linux上的iptables防火墙管理实现。
容器访问外部网络
默认,容器可以访问宿主机。而容器如果想要通过宿主机访问外部网络,需要宿主机进行转发。在宿主机中检查转发是否打开
$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward=1
如果为0,则说明转发没有开启,可以手动打开
$ sysctl -w net.ipv4.ip_forward=1
如果启动Docker服务时设定--ip-forward=true
,则Docker自动设定net.ipv4.ip_forward=1
容器间的访问
默认所有容器连接在docker0网桥,因此所有容器默认是拓扑互通的。当启动Docker服务时,默认会在iptables添加FORWARD链添加一条“允许”转发的策略,而通过配置--icc=true|false
(默认true)可以控制容器访问策略。
出于安全考虑,可以在/etc/default/docker
文件配置DOCKER_OPTS==--icc=false
默认禁止容器间的相互访问。
而在Docker服务启动时指定--iptables=false
则会修改宿主机系统上的iptables规则。
即便在--icc=false
禁用容器间相互访问后,仍然可以通过--link
允许访问指定容器的开放端口。
比如,在启动Docker服务时,使用--icc=false --iptables=true
配置容器间禁止访问,但允许Docker自动修改系统中的iptables,此时系统中的iptables规则可能是禁止所有转发流量.当启动容器时,使用--link参数连接容器,Docker会在iptables为两个互联容器添加一条ACCEPT规则,允许相互访问开放的端口。