docker容器啓動後添加端口映射

概要

網上有許多人在查找關於容器啓動後可否進行端口映射的問題。我曾經也問過分娘,很遺憾我沒找到。本文就這個問題給出一個解決方法,旨在拋磚引玉。本文的思路是使用iptables的端口轉發,這也是docker端口映射內部的實現機制,只不過我是顯示地寫出來罷了,爲的就是讓查找這個問題的人對docker的端口映射有一個直觀的瞭解。
docker

結論:容器啓動後是能夠添加端口映射的,但不建議手工添加,最好使用docker提供的功能。shell

步驟

建立兩個容器並進行了端口映射,結果如圖所示:
tcp

假如,我start一個容器,其內部IP爲172.17.0.5,並在容器內部啓動了80端口。spa

FORWARD規則鏈咱們不用管它,docker已經幫咱們寫好了,咱們只須要關心NAT中的幾條鏈便可。code

查看NAT表中的PREROUTING鏈ip

從上面能夠看出,iptables將知足條件的數據都轉發到了DOCKER鏈上去了。io

查看NAT表中的DOCKER鏈table

仿照上圖,咱們添加一條本身的映射規則,將宿主的8082端口映射到172.17.0.5的80端口上去,規則以下:class

 iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 8082 -j DNAT --to-destination 172.17.0.5:80

查看NAT表中的POSTROUTING鏈容器

仿照上圖中的規則,書寫的規則以下:

 iptables -t nat -A POSTROUTING -s 172.17.0.5/32 -d 172.17.0.5/32 -p tcp -m tcp --dport 80 -j  MASQUERADE

查看FILTER表中的DOCKER鏈

仿照上圖書寫規則以下:

 iptables -t filter -A DOCKER -d 172.17.0.5/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT

結果

雖然IP爲172.17.0.5的容器沒有開啓端口映射,以下圖所示:

但咱們依然可以經過訪問宿主機(192.168.78.238)的8082端口來訪問172.17.0.5的80端口,效果以下:

使用此方法有一個缺點,不能訪問localhost:8082,也就是說若是想對localhost也進行轉發,須要進行額外的配置。

結論

建議你們不要像我這樣去作端口映射,我這麼作只是爲了闡述標題。

若是你們在容器中添加了一些東西,並開啓了端口,同時呢,又想多複製幾個這樣的容器。建議你們把容器提交成鏡像,而後使用docker提供的端口映射功能。

相關文章
相關標籤/搜索