01-Docker 容器启动后修改或添加端口

前言

一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如

1
docker run -itd -p 本地端口:容器内端口 所用镜像名

参数说明

  • -d 表示后台运行容器
  • -t 为docker分配一个伪终端并绑定到容器的标准输入上
  • -i 是让容器的标准输入保持打开状态
  • -p 指定映射端口

即创建容器时,你可以设置一个端口来进行宿主机和容器之间端口的映射,比如外边的8080与容器内的22进行映射后,那你可以使用 宿主机IP:8080 在xshell进行连接容器了

但是如果这个容器已经启动了,你在想添加映射或修改端口映射,该怎么办呢,Docker 并没有提供直接修改映射的命令,下面提供两种方式。

方式一:利用 docker commit 新构建镜像

把当前容器停了(当然你要不想停也可以,只是打包会慢一点,如果你怕出现特殊情况,最好先把容器停了),然后把这个容器打包成镜像,然后使用这个镜像开启新的容器,在使用新的镜像运行容器时重新指定要映射的端口

实操如下:

1
2
3
4
5
6
7
8
# 停止容器
docker stop 容器名字或者编号

# 将容器打包成镜像
docker commit 容器名字或者编号 你想起的镜像名字

# 用新镜像开启新容器
docker run -itd --name 你起的容器名 -p 外边的端口:容器内端口 -p 外边的端口:容器内的端口... 刚才的镜像名

方式二:修改文件端口,重启 docker 服务

修改要容器的配置文件,这样就不需要每次想要添加端口映射,就得重新创建一边容器了

1
2
3
4
5
6
7
8
9
10
11
# 1. 先停掉容器
docker stop 容器ID

# 2. 停掉docker服务,不然直接修改配置文件不会生效
systemctl stop docker

# 3. 查找要修改容器的容器Id(当然你也可以直接通过docker ps -a查看)
docker inspect 容器Id | grep Id

# 4. 进到/var/lib/docker/containers 目录下找到与 Id 相同的目录,修改 hostconfig.json 和 config.v2.json文件:
cd /var/lib/docker/containers/容器Id

修改 hostconfig.json 文件,找到 PortBindings:{} 配置,在里面进行修改

1
2
vim hostconfig.json
# 如增加外部端口是10000,容器内部端口是50070的配置,格式:"50070/tcp": [{"HostIp": "","HostPort": "10000"}]

1
vim config.v2.json

这两个文件在写入的时候都建议写在原有端口的后面,然后重启

1
2
3
4
5
6
7
8
# 1. 重新启动docker
systemctl start docker

# 2. 查看端口是否绑定成功
docker ps -a

# 也可以用这个命令来查看宿主机和容器之间的端口是否映射成功
netstat -an | grep 宿主机的映射端口

同理,你也可以通过这种方式来删除添加错误的端口

方式三:删除原有容器,重新建新容器

这个方案最简单,缺点时之前容器内的新增文件和配置会丢失。


01-Docker 容器启动后修改或添加端口
https://flepeng.github.io/042-云原生-01-Docker-01-Docker-容器启动后修改或添加端口/
作者
Lepeng
发布于
2023年3月9日
许可协议