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虚拟机不是非常可定制的(它们的目标是易于使用/设置)。
-
使用到主机的networking路由创build一个Docker虚拟机。
为VM创build一个“外部networking交换机” 。
在VirtualBox的桥接适配器将做。 也可以通过仅主机networking适配器进行设置,但由于大多数容器需要互联网访问,因此可能会稍微复杂一些,所以需要使用第二个适配器。
-
Ping Docker虚拟机
您应该能够从主机ping虚拟机的主界面,反之亦然
C:\> ping 192.168.98.30
-
确保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
-
通过虚拟机添加到私有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设置更进一步,以便容器可以连接到网桥,并直接从主机访问。