2.7 KiB
容器访问控制
容器的访问控制,主要通过Linux上的iptables
防火墙来进行管理和实现。iptables
是Linux上默认的防火墙软件,在大部分发行版中都自带。
容器访问外部网络
容器要想访问外部网络,需要本地系统的转发支持。在Linux系统中,检查转发是否打开。
$sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果为0,说明没有开启转发,则需要手动打开。
$sysctl -w net.ipv4.ip_forward=1
如果在启动Docker服务的时候设定--ip-forward=true
, Docker就会自动设定系统的ip_forward
参数为1。
容器之间访问
容器之间相互访问,需要两方面的支持。
- 容器的网络拓扑是否已经互联。默认情况下,所有容器都会被连接到
docker0
网桥上。 - 本地系统的防火墙软件 --
iptables
是否允许通过。
访问所有端口
当启动Docker服务时候,默认会添加一条转发策略到iptables的FORWARD链上。策略为通过(ACCEPT
)还是禁止(DROP
)取决于配置--icc=true
(缺省值)还是--icc=false
。当然,如果手动指定--iptables=false
则不会添加iptables
规则。
可见,默认情况下,不同容器之间是允许网络相互访问的。如果为了安全考虑,可以在/etc/default/docker
文件中配置DOCKER_OPTS=--icc=false
来禁止它。
访问指定端口
在通过-icc=false
关闭网络访问后,还可以通过--link=CONTAINER_NAME:ALIAS
选项来访问容器的开放端口。
例如,在启动Docker服务时,可以同时使用icc=false --iptables=true
2个参数来关闭允许相互的网络访问,并让Docker可以修改系统中的iptables
规则。
此时,系统中的iptables
规则可能是类似
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- 0.0.0.0/0 0.0.0.0/0
...
之后,启动容器(docker run
)时使用--link=CONTAINER_NAME:ALIAS
选项。docker会在iptable
中为2个容器分别添加一条ACCEPT
规则,允许相互访问开放的端口(取决于dockerfile中的EXPOSE行)。
当添加了--link=CONTAINER_NAME:ALIAS
选项后,添加了iptables
规则。
$ sudo iptables -nL
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 172.17.0.2 172.17.0.3 tcp spt:80
ACCEPT tcp -- 172.17.0.3 172.17.0.2 tcp dpt:80
DROP all -- 0.0.0.0/0 0.0.0.0/0
注意:--link=CONTAINER_NAME:ALIAS
中的CONTAINER_NAME
目前必须是Docker分配的名字,或使用--name
参数指定的名字。主机名则不会被识别。