Dockernetworking没有暴露给Windows上的主机

我有一个docker-compose.yml中的ngnix服务和networking的基本configuration

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 

在Linux上,docker-compose将在172.21.20.x子网中创build虚拟networking接口,在172.21.20.30上可以访问ngnix。 这对我的开发团队非常有用,我们正在使用它来组织多个项目。

在运行docker docker-compose up -d Windows(基于hyperV的Docker for Windows)之后docker-compose up -d没有创build新的networking接口。

我已经尝试更改Docker deamon设置,我已经添加了

 { "bridge": "none" } 

守护进程configuration,这应该是防止docker创build其默认networking(DockerNAT),并强制它公开所有的networking作为主机上可见的接口,但没有任何改变。

有没有什么方法可以在Docker for Windows上暴露主机上的Dockernetworking?

Windows / Mac容器networking的Docker无法从主机访问。

Docker在HyperV中运行的Alpine Linux虚拟机中的网桥上创buildnetworking。 这些networking不会暴露给VM主机。 唯一的networking访问容器是通过映射的TCP或UDP端口。

有许多方法可以设置一个可以访问的虚拟机,但是通常包括使用自定义虚拟机而不是Docker for Windows / Mac(或Docker Machine ),因为Docker虚拟机不是非常可定制的(它们的目标是易于使用/设置)。

  1. 使用到主机的networking路由创build一个Docker虚拟机。

    为VM创build一个“外部networking交换机” 。

    在VirtualBox的桥接适配器将做。 也可以通过仅主机networking适配器进行设置,但由于大多数容器需要互联网访问,因此可能会稍微复杂一些,所以需要使用第二个适配器。

  2. Ping Docker虚拟机

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

     C:\> ping 192.168.98.30 
  3. 确保Docker虚拟机中的IP路由select已打开

    将IP转发添加到sysctl(Debian上的/etc/sysctl.d/99-sysctl.conf

     net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 

    然后重新加载sysctl文件来获取configuration

     sysctl --system 
  4. 通过虚拟机添加到私有Dockernetworking的路由

    现在告诉您的VM主机如何到达Dockernetworking。

     route -p ADD 172.21.20.0 MASK 255.255.255.0 192.168.98.30 

我这样做与Vagrant / Debian / VirtualBox主要如此,如果HyperV术语closures, 通过创build连接到仅主机networking的整个网桥,我的Vagrant设置更进一步,以便容器可以连接到网桥,并直接从主机访问。