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 并不一定完全固定,可能会因系统及配置而发生变化,应用也需要更改。