# Docker容器连接宿主机MySQL数据库配置 ## 问题描述 当Docker容器需要连接到宿主机上的MySQL数据库,而MySQL的用户账号只允许`@localhost`访问时,需要进行特殊配置。 ## 解决方案 ### 1. 修改Docker Compose配置 在`docker-compose.yml`文件中,将数据库主机地址修改为`host.docker.internal`,这是Docker提供的特殊DNS名称,可以解析到宿主机的IP地址。 ```yaml 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权限(推荐用于测试环境) ```sql -- 登录到宿主机的MySQL mysql -u root -p -- 执行以下SQL语句 UPDATE mysql.user SET Host = '%' WHERE User = 'shop_mallnew' AND Host = 'localhost'; FLUSH PRIVILEGES; ``` #### 解决方案2:创建新用户,允许从任何IP连接 ```sql -- 登录到宿主机的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范围连接(推荐用于生产环境) ```sql -- 登录到宿主机的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容器 ```bash 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.yml`:Docker容器配置文件 - `update_mysql_user.sql`:MySQL用户权限修改脚本 - `.env`:本地开发环境配置文件