Files
sass-admin-agent-api/DOCKER_MYSQL_CONNECTION.md

3.1 KiB
Raw Blame History

Docker容器连接宿主机MySQL数据库配置

问题描述

当Docker容器需要连接到宿主机上的MySQL数据库而MySQL的用户账号只允许@localhost访问时,需要进行特殊配置。

解决方案

1. 修改Docker Compose配置

docker-compose.yml文件中,将数据库主机地址修改为host.docker.internal这是Docker提供的特殊DNS名称可以解析到宿主机的IP地址。

environment:
  DB_HOST: host.docker.internal
  DB_PORT: 3306
  DB_USER: shop_mallnew
  DB_PASSWORD: shop_mallnew
  DB_NAME: huawei_shop_mallnew

2. 处理MySQL用户权限

由于MySQL用户账号默认只允许@localhost访问需要修改用户权限以允许Docker容器访问。

解决方案1修改现有用户的host权限推荐用于测试环境

-- 登录到宿主机的MySQL
mysql -u root -p

-- 执行以下SQL语句
UPDATE mysql.user SET Host = '%' WHERE User = 'shop_mallnew' AND Host = 'localhost';
FLUSH PRIVILEGES;

解决方案2创建新用户允许从任何IP连接

-- 登录到宿主机的MySQL
mysql -u root -p

-- 执行以下SQL语句
CREATE USER 'shop_admin'@'%' IDENTIFIED BY 'shop_admin';
GRANT ALL PRIVILEGES ON shop_mallnew.* TO 'shop_admin'@'%';
FLUSH PRIVILEGES;

解决方案3创建新用户仅允许从Docker容器IP范围连接推荐用于生产环境

-- 登录到宿主机的MySQL
mysql -u root -p

-- 执行以下SQL语句假设Docker容器IP范围为172.17.0.0/16
CREATE USER 'shop_mallnew'@'172.17.0.0/255.255.0.0' IDENTIFIED BY 'shop_mallnew';
GRANT ALL PRIVILEGES ON huawei_shop_mallnew.* TO 'shop_mallnew'@'172.17.0.0/255.255.0.0';
FLUSH PRIVILEGES;

3. 启动Docker容器

docker-compose up -d

注意事项

  1. 安全性考虑:使用%作为host会允许从任何IP连接在生产环境中应限制为Docker容器的IP范围。
  2. 端口映射确保宿主机的MySQL服务监听在0.0.0.0而不仅仅是localhost以便外部连接。
  3. 防火墙设置确保宿主机的防火墙允许Docker容器访问MySQL端口默认3306
  4. MySQL版本兼容性不同版本的MySQL可能有不同的权限管理方式请根据实际版本调整SQL语句。
  5. Windows系统在Windows系统上host.docker.internal可能需要Docker Desktop 18.03+版本才能正常工作。
  6. Linux系统在Linux系统上可能需要使用--add-host=host.docker.internal:host-gateway参数或修改/etc/hosts文件。

故障排查

  1. 无法连接到数据库

    • 检查宿主机MySQL服务是否正在运行
    • 检查MySQL配置是否允许远程连接
    • 检查防火墙设置
    • 检查用户权限是否正确配置
  2. 连接被拒绝

    • 检查MySQL用户的host权限是否包含Docker容器的IP
    • 检查MySQL服务是否监听在0.0.0.0
  3. 权限错误

    • 检查用户是否有足够的权限访问指定的数据库
    • 检查FLUSH PRIVILEGES是否已执行

相关文件

  • docker-compose.ymlDocker容器配置文件
  • update_mysql_user.sqlMySQL用户权限修改脚本
  • .env:本地开发环境配置文件