問題
docker固定容器ip前提是設定net為none,此情景下所有的網路配置都失效,包括-p埠對映。
目的
使用其他的方法做埠對映,繞過net為none
方法
docker的埠對映並不是在docker技術中實現的,而是通過宿主機的iptables來實現;通過控制網橋來做埠對映,類似路由器中設定路由埠對映。
先檢查配置埠對映,iptable設定了什麼
執行:docker run -d -p 9000:9000 redis_cluster 9000
root@ubuntu:~# iptables -t nat -l -n
chain prerouting (policy accept)
target prot opt source destination
docker all -- 0.0.0.0/0 0.0.0.0/0 addrtype match dst-type local
chain input (policy accept)
target prot opt source destination
chain output (policy accept)
target prot opt source destination
docker all -- 0.0.0.0/0 !127.0.0.0/8 addrtype match dst-type local
chain postrouting (policy accept)
target prot opt source destination
masquerade all -- 172.17.0.0/16 0.0.0.0/0
masquerade tcp -- 172.17.0.1 172.17.0.1 tcp dpt:9000
chain docker (2 references)
target prot opt source destination
dnat tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 to:172.17.0.1:9000
那麼我們就可以自己寫dnat的命令,讓外部的埠進行轉換… docker建立了乙個名為dokcer的自定義的鏈條chain … … iptables自定義鏈條的好處就是可以讓防火牆的策略更加的層次化… …
檢視命令
root@ubuntu:~# iptables -s
-p input accept
-p forward accept
-p output accept
-n docker
-a forward -o docker0 -j docker
-a forward -o docker0 -m conntrack --ctstate related,established -j accept
-a forward -i docker0 ! -o docker0 -j accept
-a forward -i docker0 -o docker0 -j accept
-a docker -d 172.17.0.1/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 9000 -j accept
root@ubuntu:~# iptables -t nat -s
-p prerouting accept
-p input accept
-p output accept
-p postrouting accept
-n docker
-a prerouting -m addrtype --dst-type local -j docker
-a prerouting -p tcp -m tcp --dport 80 -j dnat --to-destination 172.17.0.1:80
-a output ! -d 127.0.0.0/8 -m addrtype --dst-type local -j docker
-a postrouting -s 172.17.0.0/16 ! -o docker0 -j masquerade
-a postrouting -s 172.17.0.1/32 -d 172.17.0.1/32 -p tcp -m tcp --dport 9000 -j masquerade
-a docker -p tcp -m tcp --dport 9000 -j dnat --to-destination 172.17.0.1:9000
執行dnat命令iptables -t nat -a prerouting -p tcp –dport 80 -j dnat –to 172.17.0.1:80
將宿主的80埠對映到docker容器的172.17.0.1的80埠
docker 追加docker容器埠對映的方法
docker run可以指定埠對映,但是容器一旦生成,就沒有乙個命令可以直接修改。通常間接的辦法是,儲存映象,再建立乙個新的容器,在建立時指定新的埠對映。但這樣太麻煩了。現在有新方案來解決掉 操作步驟 1 檢視容器 docker ps a2 停止容器 docker stop f5033 停止dock...
Docker更改容器埠對映
一般情況下是不可以改變容器的埠對映的,只有通過run命令指定。如果想要不改變容器內容和配置的情況下更改埠對映只有先停止,然後將容器打包成映象,然後在執行新的映象的時候指定新的埠對映。先停止容器 docker stop containera 將容器commit成為乙個映象 docker commit ...
Docker容器修改埠對映
對於已經建立的docker容器,需要新增容器對主機的埠對映,主要分為三種 1.使用docker ps a命令找到要修改容器的container id 2.執行以下命令,進入該容器目錄 docker inspect container id grep id cd var lib docker cont...