大家都知道docker run可以指定端口映射,但是容器一旦生成,就没有一个命令可以直接修改。通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。

那么有没有办法不保存镜像而直接修改已有的这个容器呢?有的,今天就来实操下如何修改,步骤如下:

1、启动一个容器,用于测试

[root@localhost ~]# docker run -itd -p 8080:80 --name web nginx:1.18.0

2、查看容器ID

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
92fbd2886b02        nginx:1.18.0        "/docker-entrypoint.…"   5 minutes ago       Up 5 minutes        0.0.0.0:8080->80/tcp   web

3、停止容器和docker服务

[root@localhost ~]# docker stop `docker ps -aq`

[root@localhost ~]# systemctl stop docker

4、修改容器配置文件hostconfig.json

[root@localhost ~]# vim /var/lib/docker/containers/容器ID开头的目录/hostconfig.json

打开文件后找到"PortBindings":{"80/tcp":[{"HostIp":"","HostPort":"8080"}]}该段代码,前一个数字80是容器端口, 后一个8080是宿主机端口。将宿主机的8080端口映射到容器的80端口。

现在我们要将宿主机的其他IP地址,如192.168.100.200,端口80映射到容器内的80端口,仅需修改为如下代码即可:

"PortBindings":{"80/tcp":[{"HostIp":"192.168.100.200","HostPort":"80"}]}

5、修改容器配置文config.v2.json

部分版本的Docker还需要修改config.v2.json文件,将其中的ExposedPorts的值修改为最新的端口,例如:

#原始内容
"ExposedPorts":{"18080/tcp":{}}

#修改后内容
"ExposedPorts":{"80/tcp":{}}

6、启动docker服务和容器

[root@localhost ~]# systemctl start docker
[root@localhost ~]# docker start `docker ps -aq`

7、再次查看容器的信息,发现映射的IP地址和端口已经变成我们设置的了

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                        NAMES
92fbd2886b02       nginx:1.18.0        "/docker-entrypoint.…"   About a minute ago   Up 17 seconds       192.168.100.200:80->80/tcp   web