Ubuntu服务器Docker部署多MySQL容器3307端口无法连接问题
核心故障原因
第二个MySQL实例无法连接的核心原因是端口映射配置错误。
MySQL官方容器镜像默认内部服务固定监听3306端口,不会随宿主机映射端口自动调整内部监听端口。你当前配置中mysql-db_2的端口规则写为'3307:3307',本质是将宿主机3307端口转发到容器内部的3307端口,但容器内MySQL服务从未在3307端口启动监听,自然无法建立连接。
排查验证步骤
按以下顺序逐一排查可快速定位问题:
- 检查容器运行状态:执行
docker compose ps,确认mysql-db_2状态为Up,不存在异常重启、退出的情况 - 校验端口映射规则:执行
docker compose port mysql-db_2 3306,如果返回空或报错,直接说明端口映射配置不符合MySQL容器的默认规则 - 验证容器内部服务可用性:执行
docker exec -it <mysql-db_2容器ID> mysql -uroot -p,如果能正常登录,说明MySQL服务本身运行正常,问题完全出在端口转发层 - 检查端口拦截规则:云服务器需确认安全组放开3307端口入站规则;本地Ubuntu服务器执行
ufw status确认系统防火墙未拦截3307端口流量
修复方案
- 调整
docker-compose.yml中mysql-db_2的配置,修正端口映射,同时补充必填的root密码环境变量(缺失该变量会导致MySQL容器初始化失败),建议和第一个实例保持镜像版本一致避免兼容问题:
mysql-db_2: image: mysql:8.0.28-debian # 和第一个实例版本对齐,避免默认latest版本带来的差异 command: --sql_mode="" --default-authentication-plugin=mysql_native_password restart: always ports: - '3307:3306' # 规则为 宿主机端口:容器内部端口,容器内部固定用3306 volumes: - ./data_2/files:/var/lib/mysql-files - ./data_2/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: 自定义的root用户密码 # MySQL8.0容器必须配置该参数才能正常初始化
- 清理异常初始化残留(如果之前因为配置错误启动过):
执行rm -rf ./data_2/data/*删除旧的错误初始化数据,避免新容器启动时读取到损坏的初始化文件导致异常。 - 重建容器生效配置:
执行docker compose up -d mysql-db_2重新创建第二个MySQL实例。 - 连接验证:
等待10~30秒待MySQL完成初始化后,执行mysql -h 127.0.0.1 -P 3307 -uroot -p输入设置的密码即可正常连接。
内容的提问来源于stack exchange,提问作者gilbertdim
相关产品推荐
相关产品推荐

