2016年12月21日 星期三

變更已經啟動的 Container 的 Port Mapping

在使用 Docker 時,有時會遇到當初開啟 Container 時沒有預期到的 Port Mapping 需求
例如我有個服務本來是把 443 port 轉到 11111 port,但因為想要做 SSL 測試,而測試網站只支援 443 port
因此至少在測試階段需要把服務開回到 443 port 上。

一般查到的作法不外乎是把既有的 Container 做成 image,然後重開一個新的
不過發現另一個方法,可以透過改設定的方式,在不需要重開 Container 的情況下就達到變更的目的。

參考 [1] 的第三個回應,流程如下:

  1. 停止 Container
  2. 更新 /var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
  3. 重新啟動 Docker 引擎
  4. 啟動 Container

舉例來說,本來我的 Container 的狀態如下:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                   NAMES
38b1f1511577        ubuntu:14.04        "/bin/bash"         9 months ago        Up 4 weeks          0.0.0.0:11111->443/tcp   service

可以看到 hash 是 38b1… 開頭,並且目前是 Host 主機的 11111 port 對應到 Container 的 443 port。
首先要先把 Container 停止~。

docker stop service

接著就進入 /var/lib/docker/containers/ 目錄,然後找到開頭是 38b1…. 的資料夾,編輯裡面的 hostconfig.json
可以找到 JSON 內容中有一段這樣的內容:

{
    ....
    "PortBindings": {
        "443/tcp": [{
            "HostIp": "",
            "HostPort": "11111"
        }]
    },
    ....
}

因為我的目的是要增加 443 -> 443 的設定,因此直接在裡面追加另一個 Port Mapping:

{
    ....
    "PortBindings": {
        "443/tcp": [{
            "HostIp": "",
            "HostPort": "11111"
        }, {
            "HostIp": "",
            "HostPort": "443"
        }]
    },
    ....
}

改完並儲存之後,重新啟動 Docker 引擎,並且打開 Container 後就完成了。

service docker restart
docker start service

最後看一下改完的結果:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                         NAMES
38b1f1511577        ubuntu:14.04        "/bin/bash"         9 months ago        Up 23 minutes       0.0.0.0:443->443/tcp, 0.0.0.0:11111->443/tcp  service
參考資料:
  1. How to assign a port mapping to an existing docker container?

沒有留言: