大家都知道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