在操作docker容器時發現了其乙個埠對映的bug,具體表現為:開啟容器時做了埠對映80:8080,即宿主機的80埠對映到容器內部的8080jboss埠。一開始測試也沒有什麼問題,都可以聯通,但經過幾次重啟之後,突然發現無法訪問到jboss了。**及容器內部環境沒有發生過變化,只能從宿主機外部環境考慮了。
首先,列出nat表所有鏈的所有規則,只顯示ip位址和埠號,如下
[root@ip-192-168-31-161 ~]# iptables -t nat -nlchain 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:3306
masquerade tcp -- 172.17.0.5
172.17.0.5 tcp dpt:5666
masquerade tcp -- 172.17.0.5
172.17.0.5 tcp dpt:8180
masquerade tcp -- 172.17.0.5
172.17.0.5 tcp dpt:9537
masquerade tcp -- 172.17.0.5
172.17.0.5 tcp dpt:222
masquerade tcp -- 172.17.0.8
172.17.0.8 tcp dpt:6379
masquerade tcp -- 172.17.0.9
172.17.0.9 tcp dpt:8080
chain docker (
2references)
target prot opt source destination
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:3306 to:172.17.0.1:3306
dnat tcp -- 0.0.0.0/0
0.0.0.0/0
tcp dpt:80 to:172.17.0.2:8080
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:5667 to:172.17.0.5:5666
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:8180 to:172.17.0.5:8180
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:9537 to:172.17.0.5:9537
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:226 to:172.17.0.5:222
dnat tcp -- 0.0.0.0/0
0.0.0.0/0 tcp dpt:6379 to:172.17.0.8:6379
dnat tcp -- 0.0.0.0/0
0.0.0.0/0
tcp dpt:80 to:172.17.0.9:8080
在結果在我們可以清晰的看到宿主機的80埠對映給了兩個172的內部容器ip——172.17.0.2、172.17.0.9,新啟動的容器ip為09,02是其重啟前的ip。故做如下推測:docker在重啟容器之後,重新做埠對映的時候出了問題,沒有將之前的對映規則刪除,導致後續容器無法進行正確的埠對映。解決辦法:
[root@ip-192-168-31-161 ~]# iptables -t nat -d docker 2
解釋:刪除 chain docker 中的第二條規則
外網對映nginx埠丟失問題解決
nginx監聽8082埠,2個tomcat分別為8180和8280,外網對映埠為13410。實際的訪問位址有2個,內網是外網是 節點1內網直接訪問位址為節點2內網直接訪問位址為 正常直接訪問位址1,會被redirect一次,位址為 8180 jwell km client home login。當預...
docker 追加docker容器埠對映的方法
docker run可以指定埠對映,但是容器一旦生成,就沒有乙個命令可以直接修改。通常間接的辦法是,儲存映象,再建立乙個新的容器,在建立時指定新的埠對映。但這樣太麻煩了。現在有新方案來解決掉 操作步驟 1 檢視容器 docker ps a2 停止容器 docker stop f5033 停止dock...
Docker更改容器埠對映
一般情況下是不可以改變容器的埠對映的,只有通過run命令指定。如果想要不改變容器內容和配置的情況下更改埠對映只有先停止,然後將容器打包成映象,然後在執行新的映象的時候指定新的埠對映。先停止容器 docker stop containera 將容器commit成為乙個映象 docker commit ...