连接 Docker 容器与宿主机 MySQL 的跨平台指南
在使用Docker进行开发时,一个常见的需求是让容器内的应用访问宿主机上运行的MySQL服务。本文将详细介绍在macOS、Windows和Linux系统上,如何通过Docker镜像和Docker Compose实现这一目标。
理解核心概念
Docker容器默认与宿主机网络隔离。要从容器内部访问宿主机服务,需要使用特殊的主机名或IP地址:
- macOS和Windows:使
host.docker.internal这个特殊DNS名称 - Linux:使用宿主机的实际IP地址或Docker网桥IP(通常
172.17.0.1)
准备工作:配置MySQL
无论使用哪种平台,都需要先确保MySQL允许外部连接:
MySQL配置
- 修改MySQL配置文件中
bind-address0.0.0.0 - 创建允许远程连接的用户(使
'user'@'%'而不'user'@'localhost') - 重启MySQL服务
不同平台上的连接方式
macOS系统
使用docker run命令
docker run -p 8080:8080 \
-e MYSQL_HOST=host.docker.internal \
your-app-image1
2
3
2
3
使用Docker Compose
version: '3.8'
services:
your-app:
image: your-app-image
ports:
- "8080:8080"
environment:
- MYSQL_HOST=host.docker.internal
depends_on:
- mysql
# 如果需要,也可以直接在Compose中定义MySQL服务
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
ports:
- "3306:3306"1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Windows系统
使用docker run命令
docker run -p 8080:8080 ^
-e MYSQL_HOST=host.docker.internal ^
your-app-image1
2
3
2
3
使用Docker Compose
version: '3.8'
services:
your-app:
image: your-app-image
ports:
- "8080:8080"
environment:
- MYSQL_HOST=host.docker.internal
extra_hosts:
- "host.docker.internal:host-gateway"1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Linux系统
Linux系统需要额外步骤,因为默认不支host.docker.internal。
方法一:使用宿主机的IP地址
- 查找宿主机的IP地址:
ip addr show | grep "inet " | grep -v 127.0.0.11
- 使用找到的IP地址(如192.168.1.100):
docker run -p 8080:8080 \
-e MYSQL_HOST=192.168.1.100 \
your-app-image1
2
3
2
3
方法二:使用docker run的--add-host参数
docker run -p 8080:8080 \
--add-host=host.docker.internal:172.17.0.1 \
-e MYSQL_HOST=host.docker.internal \
your-app-image1
2
3
4
2
3
4
方法三:使用Docker Compose
version: '3.8'
services:
your-app:
image: your-app-image
ports:
- "8080:8080"
environment:
- MYSQL_HOST=host.docker.internal
extra_hosts:
- "host.docker.internal:172.17.0.1"1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
使用Docker Compose的最佳实践
对于开发环境,建议使用Docker Compose统一管理所有服务:
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=mysql-host
depends_on:
- mysql
# 针对Linux系统添加extra_hosts
extra_hosts:
- "mysql-host:172.17.0.1"
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: myappuser
MYSQL_PASSWORD: myapppassword
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
故障排除技巧
- 测试连接:在容器内使
pingtelnet命令测试到宿主机的连接 - 检查防火墙:确保宿主机的防火墙没有阻止相关端口
- 查看日志:检查MySQL的日志确认连接尝试
- 验证配置:确认MySQL已正确配置为接受远程连接
总结
通过正确配置和使用适当的主机名/IP地址,可以轻松实现Docker容器与宿主机上MySQL服务的连接。不同平台间的差异主要在于如何解析宿主机地址:
- macOS/Windows:使
host.docker.internal - Linux:使用宿主机IP或通
extra_hosts配置映射
使用Docker Compose可以简化这一过程,特别是在多服务环境中,提供一致的开发体验。
💬 评论