总感觉使用docker时坑坑洼洼的,有时不留神duang的一声就掉坑里了。docker自带的网络用起来一直感觉不是太方便,比如启动一个需要访问容器内部端口的容器时只要用-v参数做端口映射,这时docker会启用一个类似这样的进程来完成端口转发的功能:
1 | $ docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.6 -container-port 5000 |
看似很美好,从外面可以访问容器内部端口。不过有两个问题需要解决:
1、如果由于某些特别的要求需要再新增加一个端口映射,怎么办。
2、此时容器内部是不能访问外网(公网),容器内的程序不能解析域名或者从公网获取数据等。
第1个问题,可以新建容器,在新建容器的时候映射多个端口。但是之前的容器还是只有一个端口映射,看似问题解决了,其实并没有解决。这2个问题都可以通过强大的iptables来解决,不用新建或重启容器只需要插入几条规则即可。
针对单台宿主机(多台宿主机集群不用考虑):
docker宿主机网卡eth1(外网)ip:222.7x.1xx.xx9/24,网关:222.7x.1xx.1
docker宿主机网卡eth0(内网)绑定到自定义的网桥br0,ip:10.0.1.10/24,网关:无
宿主机网卡配置文件如下:
1 | $ cat /etc/sysconfig/network-scripts/ifcfg-eth0 |
重启网络服务,修改docker配置文件/etc/sysconfig/docker centos6.6),让docker使用自定义网桥br0(也可以不用自定义的网桥,这里使用自定义网桥主要是为了和其它宿主机上的容器互通)。
1 | other_args="-b br0" |
网络环境基本就是这样的了,现在开始主题-修改iptables(采用脚本的方式,方便快捷)
1 |
|
执行这个设置iptables设置的脚本,容器内部就能访问外网的数据了,除了在创建容器的时候用-v参数做端口映射外,还可以在该脚本中增加新的端口映射。