最近由于喜欢上了docker技术,小沃所有的服务器开始全部采用docker技术实现了。但是不知道是否有与小沃一样的运维小伙伴,有需要在docker容器中安装ftp server的需求。如果有,您这边应该遇到了与小沃一样的问题,那就是docker的端口映射如果映射的是范围,会在创建时创建一个docker-proxy的进程,如果您这边批量映射超过10000个端口,那么您的服务器就会产生10000个这个进程,这是非常占用系统资源的。
下面,小沃就介绍一下如何解决这个问题。
方法就是,直接使用docker底层的转发技术,iptables进行转发。
当各位在一个运行了docker的环境中,并且这个环境有配置-p参数。您可以在宿主机上执行iptables-save,然后您就可以看到三段iptables的配置。
而iptables中,无论是路由转发的配置还是防火墙的配置,本身都是自带端口返回功能的。
因此,如果您需要给一个容器配置新的端口映射,您只需要添加端口的iptables即可。
但是务必要记住需要添加三段,根据不同宿主机的iptable反馈的值添加。
那么又有人问了,docker的ip是动态生成的,我们怎么知道这次生成的docker的动态ip是什么呢?
这个问提问的好,获取docker动态ip的方法是docker inspect --format='{{.NetworkSettings.IPAddress}}' dfbe74896b0b
红色字体为container的id,不同的container,id不同,请注意修改。
下面我们假设container的ip为192.168.0.2。
如果您仅仅是要添加一个端口映射,比如添加一个443端口,方法为。
iptables -t nat -A POSTROUTING -s 192.168.0.2/32 -d 192.168.0.2/32 -p tcp -m tcp --dport 443 -j MASQUERADE
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 30000:40000 -j DNAT --to-destination 192.168.0.2:443
iptables -A DOCKER -d 192.168.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 443 -j ACCEPT
注意将IP换成您自己的容易的哦。
第二个例子,这个例子更加的实用,就是为了解决容器内部ftp使用被动模式,所产生的大量问题导致。
这里我们的例子是开放30000到40000这10000个端口。
iptables -t nat -A POSTROUTING -s 192.168.0.2/32 -d 192.168.0.2/32 -p tcp -m tcp --dport 30000:40000 -j MASQUERADE
iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 30000:40000 -j DNAT --to-destination 192.168.0.2:30000-40000
iptables -A DOCKER -d 192.168.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 30000:40000 -j ACCEPT
好了,这样就可以了,请注意,不同版本的docker,不同的操作系统可能不同的效果。
实际命令需要根据命令iptables-save的返回值调整,切不可生搬硬套哦。