Docker入門系列7 動態對映埠port mapping
阿新 • • 發佈:2019-01-07
為何想要動態對映埠呢?
因為剛開始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-destination172.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