Docker MySQL连接被拒绝求助:附docker-compose配置及尝试操作
解决Docker MySQL连接拒绝问题
以下是针对你遇到的连接问题的排查和解决步骤:
1. 容器间通信核心配置修正
- 容器内连接数据库时,主机名必须使用Docker Compose中定义的服务名
db,而非容器名称app_db(服务名是Docker默认的可靠DNS别名,容器名解析仅为兼容场景)。 - 连接端口使用容器内部的
3306,不要用宿主机映射的8101——容器间通信直接访问容器内部端口即可。
2. 确认MySQL服务完全就绪
depends_on仅保证容器启动顺序,不代表MySQL服务已经完成初始化。执行以下操作验证:
- 查看MySQL容器日志,确认是否出现
ready for connections关键字:docker logs app_db - 若服务启动慢,可给
db服务添加健康检查,确保app容器在MySQL就绪后再启动:
在db服务配置中添加:
同时修改healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 5s retries: 5app服务的depends_on:depends_on: db: condition: service_healthy
3. 解决MySQL 8.0认证兼容性问题
MySQL 8.0默认使用caching_sha2_password认证插件,部分旧客户端不支持该协议,会导致连接失败。修改db服务的启动命令,强制使用兼容认证方式:
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --default-authentication-plugin=mysql_native_password
4. 测试容器间网络连通性
进入app容器,直接测试与db服务的网络连通性:
# 进入app容器 docker exec -it app /bin/bash # 测试DNS解析与连通性 ping db # 测试3306端口是否开放 nc -zv db 3306
如果无法连通,尝试重建Docker Compose网络:
docker-compose down docker-compose up -d
5. 核对连接参数一致性
确保你的应用连接配置与docker-compose.yml中的环境变量完全匹配:
- 数据库名:
zastroy - 用户名:
root - 密码:
root - 主机:
db - 端口:
3306
内容的提问来源于stack exchange,提问作者Алексей
相关产品推荐
相关产品推荐

