引言
有时想在运行的容器中再添加一个端口,特别是使用 nginx docker
时,刚开始没有预留足够的端口映射,后来又要添加几个项目,还不想启动多个nginx的容器,那么就一心想添加几个端口映射。
比如我想添加 宿主机的 [18080] 到 docker 的 [8080] 端口。
方法一:重新生成镜像
在当前容器基础上打包新镜像,重新生成容器。这种方法不喜欢,就不说了。
方法二:修改配置文件
要修改 /var/lib/docker/containers/[containerId]
目录下,hostconfig.json
和 config.v2.json
两个配置文件。
1. 停 docker 服务
一定要先停 docker 服务,要不修改无效,还会被刷回去。
systemctl stop docker
停止 docker 服务,所有的 docker 容器也自动停了。
2. 修改配置文件
2.1 修改 hostconfig.json文件
只需给 PortBindings 选项添加一项 "8080/tcp":[{"HostIp":"","HostPort":"18080"}]
{
# ... 省略其他不相关
"PortBindings":{
"22/tcp":[{"HostIp":"","HostPort":"5022"}],
# 添加新的映射代码
"8080/tcp":[{"HostIp":"","HostPort":"18080"}]
},
# ... 省略其他不相关
}
2.2 修改config.v2.json 文件
需要给 ExposedPorts 和 Ports 两处都分别添加内容:
# ... 省略其他不相关
# 对外暴露端口
"ExposedPorts":{
"22/tcp":{},
# 添加新的映射代码
"8080/tcp":{}
}
# ... 省略其他不相关
# 如果Ports字段本来就是空,那就不用修改
"Ports": {
"22/tcp": [{"HostIp": "0.0.0.0","HostPort": "5022"}],
# 添加新的映射代码
"8080/tcp": [{"HostIp": "0.0.0.0","HostPort": "18080"}],
}
# ... 省略其他不相关
docker 配置文件 config.v2.json 中 Ports 和 hostconfig.json 中 PortBindings 区别:
config.v2.json
主要用于描述容器的配置信息,Ports
字段用于指定容器内部正在监听的端口,即容器内的端口。因为ExposedPorts
字段已经对外暴露了端口,所以如果宿主机所有ip都可以映射到暴露的端口,那么此处Ports
字段就可以为空。如果需要设置对应的IP那么就应该设置。
hostconfig.json
主要用于描述容器与宿主机之间的交互信息,PortBindings
字段用于指定容器内部端口与宿主机端口的映射关系,用于实现容器内部服务的外部访问。
总结
docker 配置文件 config.v2.json
中 Ports
和 hostconfig.json
中 PortBindings
感觉重复了,冗余了。
config.v2.json
文件用于描述容器的配置信息,包括容器的命令、环境变量、暴露的端口等。其中的 Ports
字段指定容器内部正在监听的端口,但并不表示这些端口会映射到宿主机上。
hostconfig.json
文件用于描述容器与宿主机之间的交互信息,包括端口映射、挂载卷等。其中的 PortBindings
字段指定容器内部端口与宿主机端口的映射关系,用于实现容器内部服务的外部访问。
由于 Ports
和 PortBindings
都涉及容器的端口映射,有时候可能会造成一些冗余和混淆。一般来说,在 Docker 中,推荐使用 PortBindings
来指定容器的端口映射,而将 config.v2.json
中的 Ports
字段留空或不指定。这样可以更清晰地表达容器与宿主机之间的端口映射关系,减少重复配置。
不过,需要注意的是,具体的配置方式和文件内容可能会根据不同的 Docker 版本和工具而有所不同。为了确保正确的端口映射和容器配置,建议查阅相关的 Docker 官方文档或使用合适的 Docker 工具来设置容器的端口映射规则和其他配置。
更新精彩文章请关注微信公众号:大胡几哥哥