docker容器一旦啟動,參數就無法改變,生産環境中最常變的就是端口映射,為了解決這個問題,那麼首先就要規劃好,本文列出了兩種端口規劃方案,如果後續維護中出現了要增加端口映射的場景,本文也給出了動态端口映射擴容方案。
此種環境适用隻有單個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
52001
52004
52002
52005
52003
52006
…
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 上述啟動參數解釋:
-h 是指啟動後容器中的主機名。
--name 是主控端上容器的名稱,以後啟動停止容器不必用容器ID,用名稱即可,如docker stop redis-test。
-d 以背景形式運作。
-p 指定映射端口,如果需要映射UDP端口,則格式是 -p3000:3000/udp。
debian02 是基礎鏡像名稱。
/etc/rc.local 是容器的啟動指令,把多個啟動腳本放/etc/rc.local中,友善多個程式随容器開機自啟動。
此規劃比較适用于内網測試研發環境,所有對外通路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
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
在工作當中,一般增加新的服務時,就需新增一個端口映射,由于無法動态調整,通常都需要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端口就可以了。
本文轉自 dengaosky 51CTO部落格,原文連結:http://blog.51cto.com/dengaosky/1854448,如需轉載請自行聯系原作者