Docker 网络未暴露给 Windows 上的主机
Docker networks not exposed to host on Windows
我在 docker-compose.yml
中对 ngnix 服务和网络进行了基本配置
version: '3'
services:
nginx:
build: ./docker/nginx
networks:
eznet:
ipv4_address: 172.21.20.30
ports:
- 80:80
volumes:
- ./logs/nginx/:/var/log/nginx
- ${APP_PATH}:/var/www/
networks:
eznet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.21.20.0/24
On Linux docker-compose 将在 172.21.20.x 子网中创建虚拟网络接口,ngnix 可在 172.21.20.30 上访问。这对我的开发团队非常有用,我们用它来组织多个项目。
在 Windows 上(Docker 对于 Windows 基于 hyperV)在 运行 docker-compose up -d
之后没有创建新的网络接口。
我尝试更改 Docker 守护程序设置,我添加了
{
"bridge": "none"
}
到守护程序配置,它应该阻止 docker 创建其默认网络(DockerNAT)并强制它将所有网络公开为主机上可见的接口,但没有任何改变。
有什么方法可以在 Docker 主机上为 Windows 公开 docker 网络吗?
无法从主机访问 Docker for Windows/Mac 容器网络。
Docker 在 HyperV 中的 Alpine Linux 虚拟机 运行 中的网桥上创建网络。这些网络不会向 VM 主机公开。对容器的唯一网络访问是通过映射的 TCP 或 UDP 端口。
有多种方法可以设置可以访问的 VM,但它通常涉及使用自定义 VM 而不是 Docker Windows/Mac(或 Docker Machine),因为 Docker 虚拟机不是很可定制(他们的目标是简化 use/setup)。
创建一个 Docker 具有到主机的网络路由的虚拟机。
为 VM 创建 "external network switch"。
在 VirtualBox 上,桥接适配器就可以了。也可以通过仅主机网络适配器进行设置,但可能会稍微复杂一些,因为大多数容器需要访问互联网,因此需要第二个适配器。
Ping Docker VM
您应该能够从您的主机 ping 虚拟机的主界面,反之亦然
C:\> ping 192.168.98.30
确保 IP 路由在 Docker VM
中打开
将 IP 转发添加到 sysctl(/etc/sysctl.d/99-sysctl.conf
在 Debian 上)
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
然后重新加载 sysctl 文件以获取配置
sysctl --system
通过 VM 添加到私有 Docker 网络的路由
现在告诉您的 VM 主机如何访问 Docker 网络。
route -p ADD 172.21.20.0 MASK 255.255.255.0 192.168.98.30
我用 Vagrant/Debian/VirtualBox mainly so apologies if the HyperV terminology is off. My Vagrant setup 更进一步,创建了一个连接到仅主机网络的整个网桥,以便容器可以连接到网桥并直接从主机访问。
我在 docker-compose.yml
中对 ngnix 服务和网络进行了基本配置version: '3'
services:
nginx:
build: ./docker/nginx
networks:
eznet:
ipv4_address: 172.21.20.30
ports:
- 80:80
volumes:
- ./logs/nginx/:/var/log/nginx
- ${APP_PATH}:/var/www/
networks:
eznet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.21.20.0/24
On Linux docker-compose 将在 172.21.20.x 子网中创建虚拟网络接口,ngnix 可在 172.21.20.30 上访问。这对我的开发团队非常有用,我们用它来组织多个项目。
在 Windows 上(Docker 对于 Windows 基于 hyperV)在 运行 docker-compose up -d
之后没有创建新的网络接口。
我尝试更改 Docker 守护程序设置,我添加了
{
"bridge": "none"
}
到守护程序配置,它应该阻止 docker 创建其默认网络(DockerNAT)并强制它将所有网络公开为主机上可见的接口,但没有任何改变。
有什么方法可以在 Docker 主机上为 Windows 公开 docker 网络吗?
Docker for Windows/Mac 容器网络。
Docker 在 HyperV 中的 Alpine Linux 虚拟机 运行 中的网桥上创建网络。这些网络不会向 VM 主机公开。对容器的唯一网络访问是通过映射的 TCP 或 UDP 端口。
有多种方法可以设置可以访问的 VM,但它通常涉及使用自定义 VM 而不是 Docker Windows/Mac(或 Docker Machine),因为 Docker 虚拟机不是很可定制(他们的目标是简化 use/setup)。
创建一个 Docker 具有到主机的网络路由的虚拟机。
为 VM 创建 "external network switch"。
在 VirtualBox 上,桥接适配器就可以了。也可以通过仅主机网络适配器进行设置,但可能会稍微复杂一些,因为大多数容器需要访问互联网,因此需要第二个适配器。
Ping Docker VM
您应该能够从您的主机 ping 虚拟机的主界面,反之亦然
C:\> ping 192.168.98.30
确保 IP 路由在 Docker VM
中打开将 IP 转发添加到 sysctl(
/etc/sysctl.d/99-sysctl.conf
在 Debian 上)net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
然后重新加载 sysctl 文件以获取配置
sysctl --system
通过 VM 添加到私有 Docker 网络的路由
现在告诉您的 VM 主机如何访问 Docker 网络。
route -p ADD 172.21.20.0 MASK 255.255.255.0 192.168.98.30
我用 Vagrant/Debian/VirtualBox mainly so apologies if the HyperV terminology is off. My Vagrant setup 更进一步,创建了一个连接到仅主机网络的整个网桥,以便容器可以连接到网桥并直接从主机访问。