天天看點

騷操作!給已運作的 docker 容器修改端口映射?

容器未啟動?

如果你的容器還沒有建構時,想添加端口映射時,你隻需要在建立容器的時候添加 ​

​-p​

​​ 參數,想添加幾個端口映射就追加幾個 ​

​-p​

​ 參數。類似于如下示例:

docker run --name api_dfo_hyperf_ws \
-v /Users/pudongping/glory/codes/dfo/api_dfo_hyperf:/api_dfo_hyperf \
-p 9502:9502 \
-p 9503:9503 \
-p 9504:9504 \
-p 9505:9505 -it \
--entrypoint /bin/sh \      

容器已啟動?

但是想修改或者添加端口時,先停止掉正在運作的容器。

以下内容都是以容器 id 為 ​

​cbe26510c276​

​ 進行操作的,請務必将容器 id 換成你自己需要修改的容器 id。
docker stop {容器的名稱或者 id }      

比如:

docker      

檢視容器完整的 ​

​hash_of_the_container​

​ 數值:

docker inspect {容器的名稱或者 id } | grep Id

# 比如:
docker inspect cbe26510c276 | grep Id
# 會得到如下結果:
# "Id": "cbe26510c276fa9a4487a8c2af8cbb49410f2a5305149d2b26eb8ce37c777d00"      

打開 ​

​hostconfig.json​

​ 配置檔案

vim /var/lib/docker/containers/{hash_of_the_container}/hostconfig.json      

比如:

vim      

如果你不想先檢視完整的容器 ​

​hash_of_the_container​

​​ 數值,你也可以直接先切換到目前容器相關目錄中 ​

​cd /var/lib/docker/containers/{hash_of_the_container}*​

​​ , 然後再去編輯 ​

​hostconfig.json​

​ 配置檔案。

cd /var/lib/docker/containers/{hash_of_the_container}*      

比如

cd      

然後再去編輯 ​

​hostconfig.json​

​ 配置檔案:

vim      

修改 ​

​hostconfig.json​

​ 配置檔案

在 ​

​hostconfig.json​

​​ 配置檔案中,找到 ​

​"PortBindings":{}​

​​ 這個配置項,然後進行修改。我這裡添加了兩個端口映射,分别将主控端的 ​

​8502​

​​ 端口以及 ​

​8505​

​​ 端口映射到容器的 ​

​8502​

​​ 端口和 ​

​8505​

​ 端口。

​HostPort​

​ 對應的端口代表 主控端 的端口。

建議容器使用什麼端口,主控端就映射什麼端口,友善以後管理。當然,具體情況,具體分析。
{
    "PortBindings": {
        "8502/tcp": [
            {
                "HostIp": "",
                "HostPort": "8502"
            }
        ],
        "8505/tcp": [
            {
                "HostIp": "",
                "HostPort": "8505"
            }
        ]
    }
}      
如果 ​

​config.v2.json​

​​ 配置檔案或者 ​

​config.json​

​ 配置檔案中也記錄了端口,也需要進行修改,如果沒有,就不需要改。

隻需要修改 ​

​"ExposedPorts": {}​

​ 相關之處。

{
    "Args": [],
    "Config": {
        "ExposedPorts": {
            "8502/tcp": {},
            "8505/tcp": {}
        },
        "Entrypoint": [
            "/bin/sh"
        ]
    }
}      

最後重新開機 docker,然後檢視容器相關配置資訊是否已經修改完畢

# 重新開機 docker
service docker restart
# 或者
systemctl restart docker      

檢視容器相關配置資訊:

docker inspect {容器的名稱或者 id }
# 比如:
docker      

配置符合你的要求後,再次啟動容器:

docker start {容器的名稱或者 id }
# 比如:
docker      

​Docker Desktop for Mac​

How to login the VM of Docker Desktop for Mac

因為在 Docker for MacOS 中,容器的主控端并不是 MacOS 本身,而是在 MacOS 中運作的一個 VM 虛拟機

。虛拟機的路徑可以通過檢視 Docker Desktop 的配置界面 ​​

​Disk image location​

​ 配置獲得。

那麼我們如何進入這個虛拟機呢?

最簡單的方式是采用 justincormack/nsenter1 進入,這個鏡像隻有 101KB,已經非常小了。

docker run -it --rm --privileged --pid=host justincormack/nsenter1      
  • –rm 表示在退出的時候就自動删除該容器;
  • –privileged 表示允許該容器通路主控端(也就是我們想要登入的 VM )中的各種裝置;
  • –pid=host 表示允許容器共享主控端的程序命名空間(namespace),或者通俗點兒解釋就是允許容器看到主控端中的各種程序;

然後再進入 ​

​/var/lib/docker/containers​

​​ 目錄修改 ​

​config.v2.json​

​​ 配置檔案和 ​

​hostconfig.json​

​​ 配置檔案即可。整體來說,在 MacOS 上除了進入 ​

​/var/lib/docker/containers​

​​ 目錄時,進入方式有所不同以外,修改配置檔案方式和上文一樣。需要注意的是,修改的時候請使用 ​

​vi​

​​ 編輯器,因為這個鏡像沒有安裝 ​

​vim​

​ 編輯器的。

比如:

vi /var/lib/docker/containers/a7377587b9f08cfe87af9a8ffa4da0f90bf07fb0a1cd6833a5ffcd9c37b842d0/config.v2.json

vi      

交流