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
相关产品推荐
相关产品推荐

