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

96 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`:本地开发环境配置文件