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

docker-compose启动MySQL容器root连接被拒绝但docker run正常如何解决

问题原因
  • 配置存在无效项:network_mode: host与ports配置冲突,使用host网络模式时,容器直接复用宿主机网络栈,端口映射配置不会生效,属于冗余配置。你通过docker run启动容器时未指定host网络,使用默认桥接模式,此时从宿主机发起的连接会被MySQL识别为来自网桥网段的外部请求,匹配root用户默认的%通配符权限规则,因此可以正常访问。
  • 权限匹配问题:使用host网络模式时,你通过127.0.0.1访问MySQL,服务端会将该连接识别为来自127.0.0.1的请求,而MySQL默认初始化的root用户仅允许localhost域名的访问请求,两者属于独立的权限规则,因此触发访问拒绝。
  • 历史数据干扰:如果挂载的宿主机目录/home/myuser/bds/mysql/中存在之前生成的MySQL数据,MYSQL_ROOT_PASSWORD环境变量以及默认权限规则仅在首次初始化(数据目录为空)时生效,旧数据会导致新的配置不生效,也会引发连接失败。
解决步骤
  1. 先停止并清理现有容器,清空历史数据:
# 停止并删除docker-compose启动的容器及关联资源
docker-compose down -v
# 清空挂载的MySQL数据目录,注意提前备份必要数据
sudo rm -rf /home/myuser/bds/mysql/*
  1. 修改docker-compose.yaml配置,删除冲突的network_mode配置,优化后的配置参考:
version: '3'
services:
  mysqltest:
    image: mysql
    ports:
      - "3306:3306"
    volumes:
      - "/home/myuser/bds/mysql/:/var/lib/mysql"
    user: "1000:1000"
    environment:
      MYSQL_ROOT_PASSWORD: "mysecret"
  1. 重新启动容器,等待MySQL初始化完成(约10-30秒)后再尝试连接:
docker-compose up -d
# 测试连接
mysql -h 127.0.0.1 -u root -pmysecret
可选:如果需要保留host网络模式

删除配置中的ports项,连接时使用localhost替代127.0.0.1,或进入容器手动给root用户开放127.0.0.1的访问权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'mysecret' WITH GRANT OPTION;
FLUSH PRIVILEGES;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:09:05