Docker Desktop(WSL2 后端)三层网络互通技术文档

Docker Desktop(WSL2 后端)三层网络互通技术文档

1. 文档概述

本文档针对 Windows 系统 + Docker Desktop 启用 WSL2 后端的运行模式,结合实际环境IP地址,完整解析容器、WSL2虚拟机、Windows主机三层网络的组成结构、互通机制与全量流量路径,明确两块Hyper-V虚拟网卡的角色分工。

2. 环境基准信息

基于当前运行环境的实际网络参数:

网络层级 设备/接口 IP地址/网段 角色说明
Windows主机 Hyper-V Virtual Ethernet Adapter #2(WSL虚拟网卡) 172.30.64.1/20 WSL2虚拟交换机的Windows侧网关,核心工作网卡
Windows主机 Hyper-V Virtual Ethernet Adapter(DockerNAT虚拟网卡) 172.27.224.1 Windows容器模式预留网卡,WSL2后端模式下闲置
WSL2层 docker-desktop实例 eth0 172.30.65.150/20 WSL2虚拟机业务网卡,容器流量的中转节点
容器层 docker0 网桥 172.17.0.1/16 Docker默认桥接网络,容器网关
容器层 Nginx示例容器 eth0 172.17.0.2/16 业务容器网络接口

3. 整体网络架构总览

三层网络呈嵌套式结构,通过两层网桥 + 两级NAT实现逐层转发,完整拓扑如下:

复制代码
┌──────────────────────────────────────────────────────────────────────┐
│                           Windows 主机                              │
│  ┌─────────────┐    ┌──────────────────────────────────────┐       │
│  │ 物理网卡    │    │ vEthernet (WSL): 172.30.64.1/20      │       │
│  │(外网/局域网)│   │ vEthernet (DockerNAT): 172.27.224.1  │       │
│  └──────┬──────┘    └───────────────────┬──────────────────┘       │
└─────────┼───────────────────────────────┼──────────────────────────┘
          │                               │
          │                       Hyper-V WSL 虚拟交换机
          │                               │
┌─────────┴───────────────────────────────▼──────────────────────────┐
│                     docker-desktop(WSL2 虚拟机)                   │
│                        eth0: 172.30.65.150/20 (150是wsl2-Linux主机,就是Dockerd运行的环境)                  │
│                                                                     │
│  ┌──────────────────────────────────────────────────────────────┐   │
│  │  docker0【被隐藏了,可以通过dcoker inspect 查看】 网桥: 172.17.0.1/16 (dockerd 管理)                │   │
│  │  ┌─────────┐   ┌─────────┐          ┌─────────┐             │   │
│  │  │ veth    │   │ veth    │   ...    │ veth    │             │   │
│  │  └────┬────┘   └────┬────┘          └────┬────┘             │   │
│  └───────┼─────────────┼────────────────────┼──────────────────┘   │
└──────────┼─────────────┼────────────────────┼──────────────────────┘
           │             │                    │
┌──────────▼─────┐ ┌────▼──────────┐ ┌───────▼──────────┐
│  Nginx 容器     │ │  容器2        │ │  其他容器        │
│  172.17.0.2    │ │  172.17.0.x   │ │  ...             │
└────────────────┘ └───────────────┘ └──────────────────┘

4. 各层网络详细解析

4.1 容器网络层(最内层)

  • 核心设备 :Linux 内核网桥 docker0,由 dockerd 进程启动时自动创建并管理
  • 网段范围 :默认 172.17.0.0/16,网关为网桥自身IP 172.17.0.1
  • 工作机制
    每启动一个容器,dockerd 会创建一对 veth 虚拟网线:一端插入容器的独立网络命名空间,作为容器的 eth0 网卡;另一端挂载到 docker0 网桥上。
  • 核心能力
    同一桥接网络下的容器可直接通过二层网络互通,无需经过上层路由;用户自定义bridge网络还支持通过容器名进行DNS解析互访。

4.2 WSL2 虚拟机网络层(中间转发层)

  • 核心设备docker-desktop WSL2 实例的 eth0 网卡,由 Hyper-V 虚拟交换机分配IP
  • 网段范围172.30.64.0/20,默认网关指向 Windows 主机的 WSL 虚拟网卡 172.30.64.1
  • 核心组件:dockerd 守护进程、iptables 规则集、系统路由表
  • 核心作用
    是容器网络与Windows主机网络的唯一中转节点,负责执行容器端口DNAT转发、出网SNAT地址转换,同时承载Docker引擎的全部运行时逻辑。 说明:所有容器均运行在 docker-desktop 这个专用WSL实例内,而非用户手动安装的Ubuntu等发行版。

4.3 Windows 主机网络层(最外层)

Windows主机上的两块Hyper-V虚拟网卡分工明确,不可混淆:

  1. 核心工作网卡:vEthernet (WSL)(对应 172.30.64.1)
    • 本质:Hyper-V 为 WSL2 功能创建的专属虚拟交换机,在Windows主机侧的网关接口
    • 作用:所有WSL2发行版(含docker-desktop)均接入此虚拟交换机,是WSL与Windows主机、外网通信的核心通道
  2. 预留网卡:vEthernet (DockerNAT)(对应 172.27.224.1)
    • 本质:Docker Desktop 为「Windows容器模式」预留的虚拟交换机
    • 作用:仅当切换为Windows原生容器模式时启用,WSL2后端跑Linux容器时完全不参与流量转发,处于闲置状态

5. 核心流量通路详解

5.1 同网络容器间互访

  • 流量路径:容器A eth0 → veth 虚拟线 → docker0 网桥 → veth 虚拟线 → 容器B eth0
  • 特点:纯二层数据转发,不经过WSL2内核路由和iptables,转发延迟最低;无需配置端口映射。

5.2 Windows 主机访问容器(端口映射场景)

docker run -p 8080:80 nginx 为例,完整转发路径:

  1. Windows侧应用访问 localhost:8080,请求被 Docker Desktop 的Windows用户态代理进程接收
  2. 代理将流量通过 Hyper-V 虚拟交换机转发至 WSL2 虚拟机的 172.30.65.150:8080
  3. WSL2内核中,dockerd 配置的 iptables DNAT 规则将 8080 端口流量转发至容器网段 172.17.0.2:80
  4. 流量经 docker0 网桥到达 Nginx 容器的 80 端口

补充:也可直接通过 172.30.65.150:8080 访问,跳过localhost代理,转发效果一致。

5.3 容器访问 Windows 主机

  • 流量路径:容器 eth0 → docker0 网桥 → WSL2内核路由 → Hyper-V虚拟交换机 → Windows侧 WSL虚拟网卡(172.30.64.1)→ Windows主机服务
  • 便捷方式 :容器内直接访问域名 host.docker.internal,Docker Desktop 会自动将该域名解析为Windows主机的WSL网关IP(即172.30.64.1)
  • 注意事项:Windows防火墙默认会拦截WSL网段的入站请求,目标服务需提前放行对应防火墙规则。

5.4 容器访问 WSL2 虚拟机本身

  • 流量路径:容器 eth0 → docker0 网桥 → WSL2内核本地路由 → WSL2 eth0(172.30.65.150)
  • 容器可直接通过WSL2的IP访问虚拟机内部服务,也可通过docker0的网关IP 172.17.0.1 等价访问。

5.5 容器访问外部网络(互联网/局域网)

流量经过两级NAT地址转换

  1. 第一级(容器→WSL2):容器出网流量经 WSL2 内核 iptables SNAT 规则,源IP转换为 WSL2 虚拟机IP 172.30.65.150
  2. 第二级(WSL2→Windows):WSL2出网流量经 Hyper-V 虚拟交换机NAT转换,源IP转换为 Windows 物理网卡的局域网/公网IP
  • 最终外部网络看到的请求源IP为Windows主机的物理网卡IP。

6. 关键特性与常见误区

  1. WSL2 网络为NAT模式,非桥接模式

    WSL2虚拟机不直接接入物理局域网,IP由Hyper-V虚拟交换机动态分配,重启后可能变化;局域网内其他设备无法直接访问WSL2及容器,需通过Windows端口转发实现。

  2. --net=host 并非共享Windows主机网络

    WSL2模式下的 --net=host 仅共享 docker-desktop WSL2虚拟机的网络命名空间,而非Windows主机的网络,无法直接获取物理网卡IP。

  3. host.docker.internal 是Docker注入的DNS记录

    该域名并非系统原生存在,由Docker Desktop内置的DNS劫持实现,仅容器内可解析;原生WSL发行版默认不支持该域名。

  4. 两块虚拟网卡无关联

    WSL虚拟网卡与DockerNAT虚拟网卡是两套独立的虚拟交换机,分别服务于WSL2 Linux容器和Windows原生容器,不存在嵌套或级联关系。

7. 架构验证命令

Windows PowerShell 侧

powershell 复制代码
# 查看所有WSL发行版状态
wsl --list --verbose

# 查看Windows虚拟网卡IP配置
ipconfig

# 进入docker-desktop WSL实例
wsl -d docker-desktop

WSL2 内部(docker-desktop实例)

bash 复制代码
# 查看所有网卡(确认eth0和docker0)
ip a

# 查看系统路由表(确认默认网关为172.30.64.1)
ip route

# 查看端口转发的NAT规则
iptables -t nat -L

# 查看dockerd进程
ps aux | grep dockerd
相关推荐
Lhappy嘻嘻1 小时前
网络(六)|应用层 HTTP&HTTPS:URL、请求响应、Cookie 与证书
网络·http·https
星恒讯工业路由器2 小时前
四张网协同演进:新一代通信网对工业通信设备意味着什么?
网络·物联网·智能路由器·工业路由器·工业物联网·5g-a·新一代通信网
小程序设计2 小时前
校园网络资产自动探测与安全状态评估系统设计与实现
网络·安全
新时代牛马2 小时前
PCI与PCIe 完整篇:硬件拓扑→ 报文协议→配置/BAR → Linux 驱动(一条主线讲透)
linux·运维·网络
LuiChun2 小时前
与精神病患者的日常探讨20260913
docker
闲云野鹤在人间2 小时前
Docker入门|第1章 容器生态系统完整解析
运维·服务器·docker·容器·centos
筝筝ba2 小时前
如何跳过FFDC
xml·linux·运维·服务器·网络
●VON3 小时前
Flutter 鸿蒙插件适配实战:用 network_status_bridge 0.0.5 查询并监听默认网络
网络·flutter·华为·harmonyos·鸿蒙
u0109053593 小时前
NAS远程访问内网穿透方案之使用神卓N600实现不限速方法
服务器·网络·数据库