docker容器一旦启动,参数就无法改变,生产环境中最常变的就是端口映射,为了解决这个问题,那么首先就要规划好,本文列出了两种端口规划方案,如果后续维护中出现了要增加端口映射的场景,本文也给出了动态端口映射扩容方案。
1、单IP多容器映射规划方案 此种环境适用只有单个IP环境下,如云主机等。
1.1 端口映射规划表格:
规划不同的端口段,映射到容器从而对外提供服务。
主机名称 |
ssh映射
|
mysql映射
|
nginx映射
|
redis映射
|
||||
redis-test
|
51000
|
22
|
51001
|
3306
|
51004
|
80
|
51002
|
6379
|
51005
|
8000
|
51003
|
6381
|
|||||
51006
|
8888
|
|||||||
scheduler-test
|
52000
|
22
|
52001
|
3306
|
52004
|
80
|
52002
|
6379
|
52005
|
8888
|
52003
|
6381
|
|||||
52006
|
8000
|
|||||||
…
|
…
|
…
|
…
|
…
|
…
|
…
|
…
|
…
|
1.2 对应容器启动命令:
docker run -h=”redis-test” –name redis-test -d -p 51000:22 -p 51001:3306 -p 51003:6379 -p 51004:6381 -p 51005:80 -p 51006:8000 -p 51007:8888 debian02 /etc/rc.local
docker run -h=”salt_zabbix_manager02″ –name salt_zabbix_manager02 -d -p 52000:22 -p 52001:3306 -p 52003:6379 -p 52004:6381 -p 52005:80 -p 52006:8000 -p 52007:8888 debian02 /etc/rc.local
1.3 上述启动参数解释:
2、多IP多容器映射规划方案 此规划比较适用于内网测试研发环境,所有对外访问IP都需要配置在宿主机上,如以第二IP eth0:1,eth0:2这种形式配置,然后每个IP和容器的端口映射配置就可以一致了。
2.1 端口与IP映射规划表格:
(此处是内网IP,宿主机IP是10.28.103.1)
主机名称 |
对外访问IP
|
容器开放端口
|
操作系统
|
iframe-test
|
10.18.103.2
|
22 3306 80 8000 8888 443 6379 6381
|
debian7
|
web-test
|
10.18.103.3
|
22 3306 80 8000 8888 443 6379 6381
|
debian7
|
2.2 对应容器启动命令:
docker run -h=”iframe-test” –name iframe-test -d -p 10.18.103.2:22:22 -p 10.18.103.2:3306:3306 -p 10.18.103.2:6379:6379 -p 10.18.103.2:6381:6381 -p 10.18.103.2:80:80 -p 10.18.103.2:8000:8000 -p 10.18.103.2:8888:8888 -p 10.18.103.2:443:443 debian-iframe-test /etc/rc.local
docker run -h=”web-test” –name web-test -d -p 10.18.103.3:22:22 -p 10.18.103.3:3306:3306 -p 10.18.103.3:6379:6379 -p 10.18.103.3:6381:6381 -p 10.18.103.3:80:80 -p 10.18.103.3:8000:8000 -p 10.18.103.3:8888:8888 -p 10.18.103.3:443:443 debian-iframe-test /etc/rc.local
3、端口映射动态扩容方案 在工作当中,一般增加新的服务时,就需新增一个端口映射,由于无法动态调整,通常都需要commit到新的镜像,然后在基于新的镜像来起容器,确实是一件很麻烦的事。
但映射的本质,是通过iptables来完成的。所以我们可以动态的用iptables增加端口映射即可,如下:
3.1 用iptables查看容器映射情况:
root@qssec-iframe:~# iptables -t nat -nvL
…
Chain DOCKER (2 references)
pktsbytes target prot opt in out source destination
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000 to:172.17.0.3:8000
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:172.17.0.3:443
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:172.17.0.3:3306
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379 to:172.17.0.3:6379
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:6381 to:172.17.0.3:6381
3470 190K DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.3:80
0 0 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888 to:172.17.0.3:8888
41 2336 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:50000 to:172.17.0.3:22
#从这里可以找到docker容器里使用的IP,然后在用iptables增加映射即可。
3.2 举例新增zabbix端口的映射:
3.2.1 单IP单容器端口扩容:
iptables -t nat -A PREROUTING -p tcp -m tcp –dport 10050 -j DNAT –to-destination 172.17.0.3:10050
iptables -t nat -A PREROUTING -p tcp -m tcp –dport 10051 -j DNAT –to-destination 172.17.0.3:10051
3.2.2 单IP多容器端口扩容:
iptables -t nat -A PREROUTING -p tcp -m tcp –dport 50010 -j DNAT –to-destination 172.17.0.3:10050
iptables -t nat -A PREROUTING -p tcp -m tcp –dport 50011 -j DNAT –to-destination 172.17.0.3:10051
#另一个容器则可以规划为60010,60011,这样在zabbix监控的时候,就需要指定客户容器的端口连接了。
3.2.3 多IP多容器端口扩容:
iptables -t nat -A PREROUTING -d 10.18.103.2 -p tcp -m tcp –dport 10050 -j DNAT –to-destination 172.17.0.3:10050
iptables -t nat -A PREROUTING -d 10.18.103.2 -p tcp -m tcp –dport 10051 -j DNAT –to-destination 172.17.0.3:10051
#iptables -t nat -A PREROUTING -d 10.18.103.3 -p tcp -m tcp –dport 10050 -j DNAT –to-destination 172.17.0.4:10050
#iptables -t nat -A PREROUTING -d 10.18.103.3 -p tcp -m tcp –dport 10051 -j DNAT –to-destination 172.17.0.4:10051
#这样zabbix连接10.18.103.2,3的正常zabbix端口就可以了。
转自:http://www.iyunv.com/thread-33701-1-1.html
转载请注明:Findever » 【转】docker容器端口IP规划及端口动态扩容