Docker自定义内网运行容器为何出现port is already allocated错误?
问题原因
你遇到的端口占用报错和Docker自定义网段没有关联,核心问题出在-p端口映射参数的作用逻辑:-p 宿主机端口:容器端口是将宿主机的物理端口绑定到指定容器的端口,宿主机的单个端口同一时间只能被一个进程/容器映射占用。你已经给生产环境的flask容器配置了-p 8080:8080占用了宿主机的8080端口,再给开发环境flask容器配置相同的端口映射自然会触发报错。
另外你的运行命令还存在一个错误:开发环境容器的--name参数值还是写的flask-live,和生产环境容器重名,后续运行也会报错。
解决方案
你的架构中所有flask容器和nginx都在同一个自定义Docker网络下,nginx可以直接通过内网IP访问两个flask容器的8080端口,不需要将flask端口暴露到宿主机,不仅能解决端口冲突问题,还能避免flask服务直接对外暴露的安全风险。
操作步骤如下:
- 停止并删除已运行的生产环境flask容器,重新启动时去掉端口映射参数:
# 停止旧容器 docker stop flask-live # 重新启动生产环境flask容器 docker run -d --rm \ --net some-network --ip 1.1.1.3 \ --name flask-live "$REGISTRY/$IMAGE"
- 运行开发环境flask容器,去掉端口映射参数同时修改容器名:
docker run -d --rm \ --net some-network --ip 1.1.1.4 \ --name flask-dev "$REGISTRY/$IMAGE"
如果有本地调试需求,需要直接访问开发环境flask服务,可以将开发容器映射到宿主机的其他未被占用端口,比如8081:
docker run -d --rm \ --net some-network --ip 1.1.1.4 \ -p 8081:8080 \ --name flask-dev "$REGISTRY/$IMAGE"
调整后你原来的nginx配置完全不需要修改,即可正常根据域名转发流量到对应环境的flask服务。
内容的提问来源于stack exchange,提问作者Archirk
相关产品推荐
相关产品推荐

