Docker 容器访问宿主机服务

docker 网络简介

docker 在安装时会默认创建三个网络:bridge(默认网络模式)、 none 、host。

  • host 直接和宿主机共用网络。
  • bridge 网络隔离,通过虚拟网桥(一般是 docker0)与宿主机通信。
  • none 禁用网络功能。

解决办法

使用 host模式(常用)

docker 运行容器时 默认桥接网络模式,如果使用 host 模式就可以访问,所以需要将 docker 的网络模式设置为 host 模式。

修改方式

  • docker run 启动容器时加入–net=host
    docker run -d --network=host my-container:latest
  • compose 文件中指定network_mode: “host”,便可以 host 模式运行容器
services:
    my-service:
        network_mode: host 

使用host.docker.internal

host.docker.internal 是一个特殊的DNS名称,用于Docker容器内部访问宿主机的地址。当容器运行时,它可以使用此名称直接连接到宿主机上运行的服务,而无需知道宿主机的IP地址。在 container 内,可以直接请求host.docker.internal:PORT,来获取宿主机上提供的各种服务

mac 和 windows

host.docker.internal 在Docker for Mac和Docker for Windows中是预定义的

需要容器应用配置中的 127.0.0.1 替换为 host.docker.internal

linux

在Linux中是不支持的。在Linux中,可以使用–add-host选项手动将宿主机的IP地址添加到容器的/etc/hosts文件中,达到效果。

使用 docker 运行容器 时,加入如下参数

--add-host=host.docker.internal:host-gateway

使用 Docker Compose,则应该将下面的语句加入 container 的声明中:

extra_hosts:
    - 'host.docker.internal:host-gateway'

使用 docker0 网络的IP

在默认的 bridge 模式下,docker0 网络的默认网关即是宿主机。在容器中使用该 IP 地址即可访问宿主机上的各种服务

  • Linux(Windows)下,docker0 网络通常会分配一个 172.17.0.0/16 的网段,其网关通常为172.17.0.1
  • macOS 下的网段则为 192.168.65.0/24,网关为192.168.65.1

这种情况下,经由 docker0 网桥而来的流量 不经过宿主机的本地回环,因此需要将宿主机上的服务配置为 监听 0.0.0.0

注意: IP 并不一定完全固定,可能会因系统及配置而发生变化,应用也需要更改。

你可能感兴趣的:(docker,容器,运维,容器高级操作,容器访问宿主机服务)