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

Docker容器中MySQL拒绝外部连接问题求助

解决Docker Compose中Python容器无法连接MySQL容器的问题

以下是针对你遇到的连接拒绝问题的具体修复步骤:

1. 用Docker Compose服务名替代固定容器IP

Docker Compose会自动创建内部虚拟网络,服务名db可以直接解析到数据库容器的地址,无需手动指定易变的容器IP。修改Python连接代码:

# 替换原来的172.20.0.2为服务名db
db = mysql.connector.connect(host='db', user='root', password='root', port=3306, database='token_data')

2. 修复MySQL环境变量冲突

你的配置中MYSQL_ROOT_PASSWORD: root与MYSQL_ALLOW_EMPTY_PASSWORD: yes同时存在,这会导致MySQL的root用户认证逻辑混乱,直接删除MYSQL_ALLOW_EMPTY_PASSWORD: yes这一行即可。

3. 确保MySQL就绪后再启动Python应用

MySQL容器启动需要完成初始化(创建数据库、用户等),Python容器可能先于数据库就绪,导致连接失败。在Docker Compose的app服务中添加依赖声明,并建议在Python代码中增加连接重试逻辑:

# 修改后的docker-compose.yml中app服务部分
app:
    container_name: myapp
    depends_on:
        - db  # 确保db容器先启动
    build: ./
    ports:
        - "5001:5000"

4. 适配MySQL 8.0的认证插件

MySQL 8.0默认使用caching_sha2_password认证插件,部分Python客户端兼容性较差。在db服务中添加启动命令强制使用旧版插件:

# 修改后的docker-compose.yml中db服务部分
db:
    container_name: mydb
    image: mysql:8.0
    ports:
        - "32001:3306"
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: token_data
        MYSQL_USER: admin
        MYSQL_PASSWORD: asdf
    command: --default-authentication-plugin=mysql_native_password  # 添加此行

额外排查步骤

如果以上修改后仍无法连接,可执行以下操作:

  • 进入Python容器测试网络连通性:docker exec -it myapp ping db 或 telnet db 3306,确认网络可达
  • 进入MySQL容器检查用户权限:
    docker exec -it mydb mysql -uroot -proot
    # 检查root用户是否允许任意主机连接
    SELECT user, host FROM mysql.user WHERE user='root';
    # 若host为localhost,执行授权:
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
    FLUSH PRIVILEGES;
    

内容的提问来源于stack exchange,提问作者SadatM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 22:30:56