Skip to main content

Docker访问宿主机上服务

如果尝试过部署 docker 容器应用,并且该应用需要访问宿主机的服务,如 Mysql,Redis。会发现应用可能无法连接,其本质的原因的就是 docker 容器内的 localhost 与宿主机的 localhost 并不是同一个东西。所以连接地址不能用 localhost 和 127.0.0.1。

宿主机是可以直接访问 docker 容器内的应用。

解决办法

使用 host 模式(常用)

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

通过docker run 启动容器时加入–net=host 参数,或在 compose 文件中指定network_mode: “host”,便可以 host 模式运行容器

该参数指定该容器使用 host 网络模式,因此也无需映射端口(不然会报警告)。

mac 和 windows

需要 env 配置中的 127.0.0.1 替换为host.docker.internal

linux

在启动 docker 时,加入如下语句

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

而在 container 内,可以直接请求 host.docker.internal:PORT,来获取宿主机上提供的各种服务 如果使用了 Docker Compose,则应该将下面的句子加入 container 的声明中:

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

使用 docker0 网络的默认网关地址

在默认的 bridge 模式下,docker0 网络的默认网关即是宿主机。在 Linux(Windows)下,docker0 网络通常会分配一个 172.17.0.0/16 的网段,其网关通常为172.17.0.1;macOS 下的网段则为 192.168.65.0/24,网关为192.168.65.1。在容器中使用该 IP 地址即可访问宿主机上的各种服务。

需要注意的是,这种情况下,经由 docker0 网桥而来的流量不经过宿主机的本地回环,因此需要将宿主机上的应用(MySQL,Redis 等)配置为监听 0.0.0.0。

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