Linux下Docker容器中MySQL无法连接的问题求助
Docker MySQL容器连接失败:Host '172.21.0.1' 不允许连接的排查与解决
问题核心分析
从你的配置和日志来看,主要有两个关键问题:
- MYSQL_ROOT_HOST的生效规则:这个环境变量仅在MySQL容器第一次初始化数据库目录时生效,如果之前已经创建过数据卷,后续修改该变量不会覆盖已有的用户权限配置。
- 端口与连接协议的匹配:日志显示容器内的MySQL X Plugin(文档存储扩展服务)占用了33060端口,但你的docker-compose是把宿主33060映射到容器的3306端口(传统MySQL协议),若DBeaver默认启用X协议,会导致连接请求发往错误端口。
分步解决方法
1. 清理旧数据卷,重新初始化容器(最有效)
你之前启动过容器,数据卷里已保存旧的用户权限配置,MYSQL_ROOT_HOST: '%'不会重新生效。执行以下命令彻底重置:
# 停止并删除容器 docker-compose down # 查看当前项目的mysql数据卷名称 docker volume ls | grep mysql # 删除对应的数据卷(替换成上面查到的卷名,比如xxx_mysql) docker volume rm xxx_mysql # 重新启动容器 docker-compose up -d
注:此操作会清空所有数据库数据,测试环境可放心执行。
2. 修正DBeaver的连接配置
打开DBeaver连接设置,确保:
- 端口填写33060(对应docker-compose的宿主端口映射)
- 进入「高级」选项卡,取消勾选「使用X协议」(X协议对应容器内33060端口,你未映射该端口到宿主)
- 关闭SSL配置:取消勾选「启用SSL」,或在「SSL属性」中选择「无」
3. 手动进入容器授权root用户(备选方案)
若清理数据卷后仍无效,直接进入容器修改用户权限:
# 进入mysql容器,输入密码secret登录 docker exec -it mysqldb mysql -u root -psecret # 执行授权命令,允许root从任何主机连接 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; # 退出mysql命令行 exit
4. 验证端口占用情况
确认宿主机器的33060端口未被其他程序占用:
# Windows系统 netstat -ano | findstr :33060 # Linux/macOS系统 lsof -i :33060
若端口被占用,修改docker-compose的ports配置(比如改成33061:3306),重新启动容器后用新端口连接。
内容的提问来源于stack exchange,提问作者Woodsman
相关产品推荐
相关产品推荐

