docker的埠對映並不是在docker技術中實現的,而是通過宿主機的iptables來實現。通過控制網橋來做埠對映,類似路由器中設定路由埠對映。比如我們有乙個容器的80埠對映到主機的8080埠,先檢視iptables到底設定了什麼規則:
sudo iptables -t nat -vnl
在結果中有一條:
chain docker
target prot opt source destination
return all -- 0.0.0.0/0 0.0.0.0/0
dnat tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.3:80
我們可以看到docker建立了乙個名為dokcer的自定義的鏈條chain。而我開放80埠的容器的ip是172.17.0.3
也可以通過inspect命令檢視容器ip:
docker inspect containerid |grep ipaddress
我們想再增加乙個埠對映,比如8081->81
,就在這個鏈條是再加一條規則:
sudo iptables -t nat -a docker -p tcp --dport 8081 -j dnat --to-destination 172.17.0.3:81
如果加錯了或者想修改:
先顯示行號檢視
sudo iptables -t nat -vnl docker --line-number
刪除規則3
sudo iptables -t nat -d docker 3
修改配置前需要先關閉docker容器的配置檔案/var/lib/docker/containers/[containerid]
目錄下,hostconfig.json
和config.v2.json
修改好之後,重啟容器服務。
docker容器被建立後會在伺服器上儲存乙個資料夾,配置檔案也放在此處,解決方法就是找到對映段都得配置檔案修改就行了。
修改之前先停掉docker
$ systemcel stop docker
在 /var/lib/docker/containers/[容器id]/下找到hostconfig.json
找到對映ip的位置,複製乙個已對映的ip,修改為自己需要的就好(443是我新增的)
"portbindings":
],"443/tcp": [
]}
相同的目錄下找到config.v2.json
該檔案中有兩處需要修改
"exposedports": ,
"80/tcp": {}
}
"ports":
],"80/tcp": [
]}
修改完之後啟動docker
$ systemctl start docker
執行成功之後啟動容器然後檢視容器執行狀態就可以看到新增加的埠在對映關係裡已存在。
同理也可以去除埠對映。
提交乙個執行中的容器為映象
docker commit containerid heropoo/example
2.執行heropoo/example
映象並新增8080對映容器80埠
docker run -d -p 8000:80 heropoo/example /bin/sh
Docker 如何動態修改容器埠對映
前言 docker埠對映往往是docker run命令時通過 p將容器內部埠對映到宿主機的指定埠上,一般來說容器的埠所對應的埠是提前確定需要對映的。但是有些情況下不得不需要臨時對映埠,例如docker中執行著mysql容器,預設埠是不開放的。那麼有什麼辦法可以讓執行中的容器暴露指定的埠呢?客官請往下...
Docker 如何動態修改容器埠對映
前言 docker埠對映往往是docker run命令時通過 p將容器內部埠對映到宿主機的指定埠上,一般來說容器的埠所對應的埠是提前確定需要對映的。但是有些情況下不得不需要臨時對映埠,例如docker中執行著mysql容器,預設埠是不開放的。那麼有什麼辦法可以讓執行中的容器暴露指定的埠呢?客官請往下...
docker給已執行容器新增開放埠
在學習nginx時,通過docker安裝後,在配置檔案中配置負載均衡,對不同的埠進行了監聽,發現配置後的 頁面404,檢視docker容器資訊後發現,容器只開放了80埠,也就是容器建立執行時通過 p引數指定的,但是nginx想要監聽不同的埠,就必須得讓容器開放該埠,同時得保證原有容器的配置和資訊不變...