【问题标题】:Accessing Docker Container IP when using WSL + Ubuntu 20.04 LTS使用 WSL + Ubuntu 20.04 LTS 时访问 Docker 容器 IP
【发布时间】:2020-12-23 15:46:48
【问题描述】:

我目前通过 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

那么,是否可以将其映射到 Windows 主机,或者带有 WSL 后端的 Docker Desktop 根本不支持通过 IP 访问容器?

【问题讨论】:

    标签: docker docker-compose windows-subsystem-for-linux


    【解决方案1】:

    简答

    是的,但维护起来通常过于复杂(涉及网络知识,以及 iptables 和 Windows 和 Linux 路由),并且首先违背了使用 docker 的目的。您可能应该将您的 WSL2 虚拟机作为您远程访问的单个外部节点来处理。

    长答案

    WSL2 中的 Docker 在 Hyper-V 内的 VM 中运行,通过一些技巧将通信从 VM 中的公开端口转发到 Windows 主机,反之亦然(这就是为什么您可以运行 docker run --rm -it -p 80:80 containous/whoami 并访问您的容器数据的原因通过 http://localhost)。

    这就是您无法使用容器 IP 直接访问容器的原因:您的容器桥接的网络来自 VM(不是 Windows 主机),因此 Windows 主机不知道在该网络中指向何处进行通信.

    然而,如果你曾经搞乱过网络,你就会知道如果一切设置正确,你总是可以从一个主机跳到另一个主机。你只需要知道你进入网络缠结的方式。 但是(总是有一个but)docker 还使用它自己的iptables 方案来通过外部网络和容器安全对容器通信进行NAT。这就是为什么简单地添加从 Windows 主机到 WSL2 虚拟机的路由是行不通的:请求将能够到达虚拟机,但不能到达容器,因为 iptables 规则将禁用它的转发(出于安全原因,似乎@ 987654321@).

    所以,总结一下,为了让您像在 Ubuntu 中一样与容器通信:

    1. 在 Windows 主机中为 VM 中的集群设置通信路由,因为 WSL2 VM 不使用静态 IP:route add <your-cluster-subnet>/<mask> <your-vm-ip>
    2. 启用从 Docker iptables 外部路由规则的转发:iptables -I DOCKER-USER -i src_if -o dst_if -j ACCEPT
    3. 利润?

    请注意,如果您使用 WSL2 的默认设置,则需要多次执行第 1 步,因为默认情况下 WSL2 虚拟机不使用静态 IP。

    我个人认为只公开端口更容易:)

    参考文献

    【讨论】:

    • 知道这真的很有帮助!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 2021-07-05
    • 2020-08-07
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多