Docker入門系列7 動態映射端口port mapping


為何想要動態映射端口呢?

因為剛開始run啟動容器時,並不知道里面需要映射哪些端口,等容器已創建了,想映射端口。

當然可以通過先commit成鏡像,然后再次run時指定端口,但會生成中間的鏡像,對於有輕微潔癖的我是不允許這種情況發生的。

我們可以對比映射前后iptables-save的變化(即沒有加-p與加了-p選項后對比):

docker run -i -t --name test -p 8080:80 1f4fd79edf6d /bin/bash 

iptables-save的結果

*nat -A DOCKER !-i docker0 -p tcp -m tcp --dport8080-j DNAT --to-destination 172.17.0.2:80*filter -A FORWARD -d 172.17.0.2/32!-i docker0 -o docker0 -p tcp -m tcp --dport80-j ACCEPT

通過“iptables -t table名 -L”查看:

filter表 Chain FORWARD ACCEPT     tcp  --  anywhere             localhost            tcp dpt:http   nat表 Chain DOCKER DNAT       tcp  --  anywhere             anywhere             tcp dpt:webcache to:172.17.0.2:80

可以看到filter表的FORWARD鏈和nat表的DOCKER鏈各添加了一條規則。

受此啟發,從而我們可以通過如下方法動態映射端口:

iptables -t nat -A DOCKER !-i docker0 -p tcp -m tcp --dport8080-j DNAT --to-destination 172.17.0.4:80 iptables -I FORWARD -d 172.17.0.4/32!-i docker0 -o docker0 -p tcp -m tcp --dport80-j ACCEPT

把“iptables -A FORWARD”改成“-I”放在第一條,用-A是添加到最后,用-I是放在最前面。

如果誤操作了,可以通過如下方法刪除:

iptables -t table名 -D chain名 rulenum [options]//rulenum 是規則的編號。從1 開始。可以使用--line-numbers 列出規則的編號 iptables -t nat -L--line-numbers iptables -t nat -D DOCKER 1

[編輯]藝搜參考

http://jar-c.blog.163.com/blog/static/116401250201061541150973/

http://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM