You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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: 5
    
    同时修改app服务的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,提问作者Алексей

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:42:11