直接原因是多个服务绑定同一宿主机端口导致启动失败;应通过 docker-compose ps、netstat 和日志定位冲突,修改 docker-compose.yaml 中 ports 映射为唯一端口,或删除 ports 仅用 docker 内网通信,并通过 project-name 和自定义网络名隔离环境。

直接原因很明确:多个服务尝试绑定同一个宿主机端口,系统拒绝后MySQL或其它服务进程启动失败,容器随即退出。这不是代码bug,而是部署配置问题。
查清谁占了端口
先确认冲突是否存在:
- 执行 docker-compose ps 看各服务状态,闪退的服务通常显示 Exit 1
- 运行 netstat -tuln | grep :端口号(比如
grep :3306),看是否已有进程监听 - 检查日志:docker-compose logs -f 服务名,重点找 Address already in use 或 Failed to bind
改端口:最快速有效的解法
在 docker-compose.yaml 中为每个服务分配唯一宿主机端口:
- MySQL 服务不要都用
"3306:3306",可改为"3307:3306"、"3308:3306" - Web 服务避免都用
"8080:80",建议按项目区分,如"18080:80"、"28080:80" - 端口段集中管理更稳妥,例如统一使用
18000–18999区间分配
关掉端口映射(适合内部通信)
如果服务之间只靠 Docker 内网通信(比如 Python 应用连 MySQL),根本不需要暴露到宿主机:
- 把
ports:整个区块删掉或注释掉 - 确保它们共用同一个自定义网络(
networks:下声明同一网络名) - Python 里连接 MySQL 就写
host: mysql(服务名)+port: 3306,不走宿主机端口
强制指定项目名,防网络重名
两个同名目录下的 docker-compose.yaml 会默认创建同名网络,导致 IP 分配混乱:
- 在
docker-compose.yaml顶部加 name: myproject-dev - 或启动时用命令指定:docker-compose --project-name myproject-dev up -d
- 再配合自定义网络名(如
networks: default: name: myproject-net),彻底隔离











