香港服务器中从Docker容器访问宿主机服务的实现方法

1. 背景介绍

在香港服务器上运行 Docker 容器时,Java 应用常常需要访问宿主机上的 MySQL 数据库。然而,由于 Docker 的网络隔离特性,容器内的程序无法直接通过 localhost 访问宿主机的服务。本文将介绍两种方法,让 Docker 容器能够顺利访问宿主机上的 MySQL 数据库。


2. 方式一:使用 host.docker.internal(推荐)

2.1 适用场景

  • 适用于 Docker for WindowsDocker 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.internalhost 网络模式访问宿主机的 MySQL 数据库。

  • 推荐使用方式一,适用于 Mac、Windows 和 Linux,兼容性更好。
  • 方式二适用于 Linux,但容器和宿主机共享网络,可能存在安全隐患。

根据具体需求选择合适的方式,确保 Java 应用能顺利连接宿主机上的 MySQL 服务器!

THE END