Docker Compose部署下API容器无法访问MySQL容器求助
问题:Docker Compose部署MySQL与API服务器,API连接MySQL时提示访问拒绝
问题详情
我用Docker Compose同时运行MySQL和API服务器,API启动后尝试连接MySQL,却一直收到访问拒绝的提示。我已经在MySQL初始化阶段添加了权限授予的SQL语句,但问题还是没解决。
错误日志
2018-05-03T05:48:45.868146Z 2 [Note] Access denied for user 'mysql'@'172.18.0.3' (using password: YES)
我的Docker Compose配置(部分)
version: "3.6" services: mysql: build: context: .. dockerfile: docker/Dockerfile-mysql image: test_mysql:ci-label container_name: test-mysql-ci-label # 剩余配置未完整提供
排查与解决方案
我来帮你一步步排查这个问题,从最常见的原因入手:
1. 先确认权限授予语句是否正确
从错误日志看,你的API容器IP是172.18.0.3,用的用户名是mysql。首先要确保你的权限语句覆盖了这个用户和IP,或者允许该用户从任意IP访问(更适合Docker环境,因为容器IP可能随重启变化):
-- 推荐:允许mysql用户从任意IP访问所有数据库 GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'%' IDENTIFIED BY '你的数据库密码' WITH GRANT OPTION; -- 必须刷新权限才能生效 FLUSH PRIVILEGES;
如果你的API容器IP固定,也可以精准指定:
GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'172.18.0.3' IDENTIFIED BY '你的数据库密码' WITH GRANT OPTION; FLUSH PRIVILEGES;
2. 检查初始化脚本是否真的执行了
Docker MySQL容器只会在第一次启动且数据卷为空时,执行/docker-entrypoint-initdb.d/目录下的初始化脚本。如果你之前已经启动过MySQL容器,数据卷里已经有现成的数据库,新的权限脚本根本不会运行。
解决方法:
- 先删除MySQL的数据卷(注意备份重要数据!):
docker-compose down -v - 重新构建并启动容器:
docker-compose up --build
3. 验证API的连接配置是否正确
别忽略最基础的配置错误:
- 主机地址:API连接MySQL时,应该用Docker Compose里的服务名
mysql,而不是固定IP(Docker内部DNS会自动解析服务名到对应容器IP,避免IP变化的问题) - 用户名/密码:确认和权限语句里的
mysql用户、密码完全一致,没有大小写或拼写错误 - 端口:确保MySQL容器暴露的端口是3306(默认),API连接时用的是这个端口
4. 手动检查MySQL内的权限记录
进入MySQL容器,直接查看用户权限是否生效:
# 进入MySQL容器,输入root密码登录 docker exec -it test-mysql-ci-label mysql -u root -p
登录后执行查询:
SELECT user, host FROM mysql.user;
看看结果里有没有mysql用户对应的%或172.18.0.3主机记录。如果没有,说明初始化脚本没执行,或者语句写错了。
5. 确认两个容器在同一个网络
默认情况下,Docker Compose会给所有服务创建一个默认网络,确保它们能互相访问。如果你自定义了网络,一定要确认API和MySQL都加入了同一个网络:
version: "3.6" services: mysql: # ...其他配置 networks: - app-network api: # ...其他配置 networks: - app-network # 定义自定义网络 networks: app-network: driver: bridge
内容的提问来源于stack exchange,提问作者Rukeith
相关产品推荐
相关产品推荐

