香港服务器中从Docker容器访问宿主机服务的实现方法
1. 背景介绍
在香港服务器上运行 Docker 容器时,Java 应用常常需要访问宿主机上的 MySQL 数据库。然而,由于 Docker 的网络隔离特性,容器内的程序无法直接通过 localhost
访问宿主机的服务。本文将介绍两种方法,让 Docker 容器能够顺利访问宿主机上的 MySQL 数据库。
2. 方式一:使用 host.docker.internal
(推荐)
2.1 适用场景
- 适用于 Docker for Windows 和 Docker for Mac(版本 18.03 及以上)
- Linux 用户需要在启动容器时 手动添加
--add-host
参数
2.2 配置方法
2.2.1 直接运行 Docker 容器
在 Linux 服务器(如香港服务器)上启动 Docker 容器时,可使用 --add-host
参数指定 host.docker.internal
指向宿主机:
docker run -dp 8080:8080 \
--add-host host.docker.internal:host-gateway \
--name java-demo \
tomcat-java-demo:latest
2.2.2 使用 Docker Compose
如果使用 docker-compose.yml
文件进行容器编排,可以在 extra_hosts
里添加 host.docker.internal
:
services:
web:
image: tomcat-java-demo:latest
container_name: java-demo
ports:
- "8080:8080"
extra_hosts:
- "host.docker.internal:host-gateway"
3. 方式二:使用 host
网络模式
3.1 适用场景
- 适用于 Linux 服务器(如香港服务器)
- 让容器直接使用宿主机的网络,无需额外配置
3.2 配置方法
3.2.1 直接运行 Docker 容器
在 Linux 服务器上,可使用 --network=host
参数运行容器,使其与宿主机共享网络:
docker run -d \
--network=host \
--name java-demo \
tomcat-java-demo:latest
3.2.2 使用 Docker Compose
在 docker-compose.yml
中,设置 network_mode: host
:
services:
web:
image: tomcat-java-demo:latest
container_name: java-demo
network_mode: host
4. 方式对比
方式 | Docker 网络模式 | 启动参数(Docker 运行) | 启动参数(Docker Compose) | JDBC 连接 URL |
---|---|---|---|---|
方式一 | Bridge 网络 | --add-host host.docker.internal:host-gateway |
extra_hosts: ["host.docker.internal:host-gateway"] |
host.docker.internal:3306 |
方式二 | Host 网络 | --network=host |
network_mode: host |
127.0.0.1:3306 |
5. 结论
在香港服务器上运行的 Docker 容器可以通过 host.docker.internal
或 host
网络模式访问宿主机的 MySQL 数据库。
- 推荐使用方式一,适用于 Mac、Windows 和 Linux,兼容性更好。
- 方式二适用于 Linux,但容器和宿主机共享网络,可能存在安全隐患。
根据具体需求选择合适的方式,确保 Java 应用能顺利连接宿主机上的 MySQL 服务器!
版权声明:
作者:后浪云
链接:https://www.idc.net/help/441167/
文章版权归作者所有,未经允许请勿转载。
THE END