我们往往通过 -p 来使得外界访问docker中的容器,比如:
docker run -p 80:80 some-app-image
但是有下面几个场景需要知道:
1,其他容器想要访问这个容器的端口,外界不允许访问,这个容易,用docker的network既可以实现。
2,为了安全问题,只允许我所知道的外界来访问这个端口,除此以外我都不允许访问。
第2个场景经常出现,比如某服务器,有外网网卡,其中某个内网应用,通过上面的 -p 开放会使得外网也能访问。对此问题,我记得最早时候的docker是没有提到这个问题的(或者在某个地方我没有注意到),为此我还专门到网上去查找资料和询问别人,别人和我说需要对iptables进行设置。
后来,我再看docker官方文档的时候,发现了Restrict connections to the Docker daemon,限制连接访问docker,文档中举了几个例子,我们来看一下这个例子:
$ iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP
-I DOCKER-USER: 表示插入用户自定义的DOCKER-USER的chain中
-i ext_if: 针对 ext_if 网卡
! -s 192.168.1.1 -j DROP: 除了来源是 192.168.1.1 以外的地址全部不能访问
那 ext_if 是什么网卡?难道是 docker 又弄出来的?到网上查了一下,到处没有说起这个 ext_if 是什么,直到我最终在docker的官方文档:where ext_if is the name of the interface providing external connectivity to the host.中找到这样的话才明白,原来这个 ext_if 就是docker daemon所在服务器的网卡名称,也就是说换成比如 eth0 这样的即可。
这个让我想起了一个故事:
微软的很多安装,有时候会蹦出这样的一段话:“请按任意键继续”,于是很多人就打电话去问微软的客服:“请问任意键在键盘中的哪个位置,我怎么找不到这个键啊?”,后来微软为了解决这个歧义,把这句话改成了:“请按空格键继续”。
那么docker文档中的这句话也出现了歧义:iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP,应该改成这样就好了,否则找了一大圈最后才发现原来出现歧义了:iptables -I DOCKER-USER -i “your_extern_interface” ! -s 192.168.1.1 -j DROP,并且用双引号括起来,这样一来每个人都能明白了。