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

解决本地及同Docker网络容器连接MySQL容器的权限拒绝问题

修复MySQL容器连接错误的方案

1. 修正Docker Compose的网络配置错误

你的docker-compose.yml中网络部分YAML格式存在错误,driver: bridge需要缩进在internal网络条目下,否则网络配置不生效,会导致容器间网络连通性异常。修正后的配置如下:

version: "3.3"
services:
  db-server:
    container_name: database
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: rootTest
      MYSQL_USER: soumalya
      MYSQL_PASSWORD: userTest
    ports:
      - "3031:3306"
    networks:
      - internal
    volumes:
      - mysql:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    restart: unless-stopped

networks:
  internal:
    driver: bridge  # 修正缩进,确保网络配置生效
volumes:
  mysql:

2. 补充用户远程访问授权

MySQL默认root用户仅允许localhost登录,同时当前init.sql未对soumalya用户授予全局权限,导致跨容器连接失败。修改init.sql添加必要授权:

create database if not exists reviews;
create database if not exists users;
create database if not exists vendors;

-- 授权soumalya用户访问指定数据库
GRANT ALL PRIVILEGES on reviews.* to 'soumalya'@'%';
GRANT ALL PRIVILEGES on users.* to 'soumalya'@'%';
GRANT ALL PRIVILEGES on vendors.* to 'soumalya'@'%';

-- 授权root用户从任意地址访问所有数据库
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'rootTest';
FLUSH PRIVILEGES;

3. 清理旧数据卷(关键步骤)

若之前已启动过容器,mysql数据卷中会保留初始化后的旧数据,此时修改init.sql或环境变量不会触发重新初始化。需删除旧数据卷后重新启动:

# 停止并删除现有容器
docker-compose down
# 查看并删除对应的数据卷(替换<项目目录名>为实际目录名)
docker volume rm <项目目录名>_mysql
# 重新启动容器
docker-compose up -d

可通过docker volume ls命令查看具体的数据卷名称

4. 移除冗余Dockerfile

你的Dockerfile仅执行ADD init.sql init.sql操作,但已经通过volume将本地init.sql挂载到容器的/docker-entrypoint-initdb.d/目录(MySQL会自动执行该目录下的SQL文件),因此该Dockerfile完全冗余,可直接删除,同时去掉docker-compose.yml中的build配置项。

验证连接

  • 宿主机连接测试:
mysql -h localhost -P 3031 -u root -prootTest
  • 同一internal网络的容器连接测试(使用服务名db-server作为主机):
mysql -h db-server -P 3306 -u soumalya -puserTest

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:41