Docker网络未在Windows上暴露给主机

时间:2017-10-08 09:24:59

标签: docker docker-compose hyper-v docker-for-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

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

在运行docker-compose up -d之后的Windows(基于hyperV的Docker for Windows)上,没有创建新的网络接口。

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

{
    "bridge": "none"
}

守护进程配置,它应该阻止docker创建其默认网络(DockerNAT)并强制它将所有网络暴露为主机上可见的接口,但没有任何改变。

有没有办法在Docker for Windows上公开Docker网络?

1 个答案:

答案 0 :(得分:2)

无法从主机访问适用于Windows / Mac容器网络的Docker。

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

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

  1. 使用到主机的网络路由创建Docker VM。

    为VM创建"external network switch"

    在VirtualBox上,桥接适配器可以。也可以通过仅主机网络适配器进行设置,但由于大多数容器需要访问Internet,因此可能会有点复杂,因此需要第二个适配器。

  2. Ping Docker VM

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

    C:\> ping 192.168.98.30
    
  3. 确保在Docker VM中打开IP路由

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

    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
    
  5. 我使用Vagrant/Debian/VirtualBox执行此操作主要是在HyperV术语关闭时道歉。我的Vagrant setup更进了一步,创建了一个连接到仅主机网络的整个网桥,以便容器可以连接到网桥并直接从主机访问。