前言

假如某一天,你突然想改變 port 的對應或者是新增或移除 port ,該怎麼做呢?

理論上 Container 為一次性的概念,所以當要改設定時,建議建立新的 Container 較為恰當。


方法

方法一:重建 Container

如前言所說,這是推薦方法。

停止要修改的 Container

1
sudo docker stop <Container ID or Name>

把 Container 建成 Image

1
sudo docker commit <Container ID or Name> <Image ID>

把剛剛創的 Image 重新建立新的 Container 並指定所需的 Port

1
sudo docker run -it --name <Container Name> -p <Host>:<Container> <Image ID> bash

方法二:修改 Container

停止要修改的 Container

1
sudo docker stop <Container ID or Name>

進入 root 帳號

1
sudo su -

修改 Container 的設定檔 hostconfig.json

1
vim /var/lib/docker/containers/<Container ID>/hostconfig.json

假設原本的 port 對應為 9453 → 22

1
2
3
4
5
6
7
8
9
10
{
"PortBindings": {
"22/tcp": [
{
"HostIp": "",
"HostPort": "9453"
}
]
}
}

改成 8888 → 22 ,其他以此類推

1
2
3
4
5
6
7
8
9
10
{
"PortBindings": {
"22/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
}

修改 Container 的設定檔 config.v2.json

1
vim /var/lib/docker/containers/<Container ID>/config.v2.json

假設原本的 port 對應為 9453 → 22

1
2
3
4
5
6
7
8
{
"ExposedPorts" : {
"22/tcp":{},"9453/tcp":{}
},
"Ports" : {
"22/tcp":[{"HostIp":"0.0.0.0","HostPort":"9453"}]
}
}

改成 8888 → 22 ,其他以此類推

1
2
3
4
5
6
7
8
{
"ExposedPorts" : {
"22/tcp":{},"8888/tcp":{}
},
"Ports" : {
"22/tcp":[{"HostIp":"0.0.0.0","HostPort":"8888"}]
}
}

重啟 Docker Engine

1
service docker restart

離開 root 帳號及重新啟動 Container

1
2
exit
sudo docker start <Container ID or Name>