使用docker-compose连接本地MySQL报错:Can't connect to MySQL server on 'localhost:3306'(99)
问题分析与解决方案
你的错误核心是network_mode: host配置与端口映射、MySQL绑定地址的冲突,导致本地无法连接容器内的MySQL服务。以下是两种可行的解决办法:
方案一:移除host网络模式(推荐)
host模式会让容器直接使用宿主机的网络栈,此时ports映射配置会失效,反而容易引发端口冲突。移除该配置后,使用Docker默认的桥接网络即可正常通过端口映射访问:
修改后的docker-compose.yml:
db-my-sql: image: mysql:latest container_name: mysql_db restart: always environment: MYSQL_DATABASE: "xyz" MYSQL_ROOT_PASSWORD: "root1234!" ports: - "3307:3306" # 移除 network_mode: "host" 配置
连接方式
本地通过localhost:3307连接MySQL:
- 命令行:
mysql -h localhost -P 3307 -u root -proot1234! - 代码中连接地址填写
localhost,端口3307
方案二:保留host网络模式并修正绑定地址
如果必须使用host模式,需要确保MySQL服务绑定到所有可用地址(默认可能仅绑定127.0.0.1,导致外部无法访问),同时检查宿主机3306端口是否被占用:
修改后的docker-compose.yml:
db-my-sql: image: mysql:latest container_name: mysql_db restart: always environment: MYSQL_DATABASE: "xyz" MYSQL_ROOT_PASSWORD: "root1234!" network_mode: "host" command: --bind-address=0.0.0.0
后续检查步骤
- 检查宿主机3306端口是否被其他服务占用:
如果有占用,停止对应服务后再重启容器。netstat -tulpn | grep 3306 - 重启容器:
docker-compose up -d - 本地通过
localhost:3306连接MySQL:mysql -h localhost -u root -proot1234!
额外排查步骤
如果仍无法连接,查看容器日志确认MySQL启动状态:
docker logs mysql_db
检查日志中是否有绑定地址失败、权限错误等信息,针对性调整。
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

