使用WSL + Ubuntu 20.04 LTS时访问Docker容器IP

olmpazwi  于 2022-11-28  发布在  Docker
关注(0)|答案(2)|浏览(551)

我目前通过WSL在Windows 10上使用Docker。我在Linux上开发了一个原生应用程序,在那里我可以通过浏览器访问容器,比如http://10.5.0.2:8088。碰巧当我使用WSL + Ubuntu做同样的事情时,我唯一能做的就是http://localhost:8088
目前,这似乎不是一个问题,但由于我正在模拟一个集群,最好避免这种事情,以免将来发生端口冲突。
举例说明:我定义了一个堆栈,它可以像这样

version: "3.7"
services:
  spark-master:
    image: master
    container_name: spark-master
    hostname: spark-master
    tty: true
    depends_on:
      - spark-worker-1
      - [...]
    ports:
      - "8088:8088"
      - "50070:50070"
      - "50030:50030"
      - "8080:8080"
      - "8042:8042"
      - "8888:8888"
      - "4040:4040"
    networks: 
      spark-network:
        ipv4_address: 10.5.0.2
  spark-worker-1:
    image: worker
    container_name: spark-worker-1
    hostname: spark-worker-1
    tty: true
    ports:
      - "8081:8081"
      - "6042:8042"
    networks: 
      spark-network:
        ipv4_address: 10.5.0.3
networks:
  spark-network:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 10.5.0.0/16

所以,可以将其Map到Windows主机,或者带有WSL后端的Docker桌面根本不支持通过IP访问容器?

c2e8gylq

c2e8gylq1#

简短回答

是的,但是它通常太复杂而难以维护(涉及网络知识,以及iptables和Windows和Linux路由),并且一开始就违背了使用Docker的目的。您可能应该将WSL 2虚拟机作为一个单独的外部节点来处理,从该节点可以进行远程访问。

长长的回答

WSL 2中的Docker运行在Hyper-V内的虚拟机中,通过一些技巧将通信从虚拟机中的公开端口转发到Windows主机,反之亦然(这就是为什么您可以运行docker run --rm -it -p 80:80 containous/whoami并通过http://localhost访问容器数据)。
这就是为什么您不能使用容器IP直接访问您的容器:Container桥接的网络来自VM(而非Windows主机),因此Windows主机不知道在该网络中指向何处进行通信。

  • 然而 *,如果你曾经在网络上乱搞,你知道如果一切都设置正确,你总是可以从一台主机跳到另一台主机。你只需要知道进入网络混乱的方式。但是(总是有一个但是)Docker也使用它自己的iptables方案来NAT容器通信通过外部网络和容器安全。简单地添加从Windows主机到WSL 2虚拟机的路由不起作用的原因是什么:该请求将能够到达VM,但不能到达容器,因为iptables规则将禁用其转发(出于安全原因,如here所示)。

所以,总结一下,为了让你像在Ubuntu中一样与你的容器通信:
1.在Windows主机中为VM中的群集设置通信路由,因为WSL 2 VM不使用静态IP:route add <your-cluster-subnet>/<mask> <your-vm-ip>
1.为外部路由启用从Docker iptables规则转发:iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
1.利润?
请注意,如果使用WSL 2的默认设置,则需要多次执行步骤1,因为WSL 2虚拟机默认情况下不使用静态IP。
就我个人而言,我认为只暴露端口更容易:)

参考资料

kfgdxczn

kfgdxczn2#

您也可以尝试在wsl 2中运行浏览器,这不是问题的解决方案
https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps

相关问题