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)。

  1. 创建一个 Docker 具有到主机的网络路由的虚拟机。

    为 VM 创建 "external network switch"

    在 VirtualBox 上,桥接适配器就可以了。也可以通过仅主机网络适配器进行设置,但可能会稍微复杂一些,因为大多数容器需要访问互联网,因此需要第二个适配器。

  2. Ping Docker VM

    您应该能够从您的主机 ping 虚拟机的主界面,反之亦然

    C:\> ping 192.168.98.30
    
  3. 确保 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
    
  4. 通过 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 更进一步,创建了一个连接到仅主机网络的整个网桥,以便容器可以连接到网桥并直接从主机访问。