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,网关为网桥自身IP172.17.0.1 - 工作机制 :
每启动一个容器,dockerd 会创建一对veth虚拟网线:一端插入容器的独立网络命名空间,作为容器的eth0网卡;另一端挂载到docker0网桥上。 - 核心能力 :
同一桥接网络下的容器可直接通过二层网络互通,无需经过上层路由;用户自定义bridge网络还支持通过容器名进行DNS解析互访。
4.2 WSL2 虚拟机网络层(中间转发层)
- 核心设备 :
docker-desktopWSL2 实例的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虚拟网卡分工明确,不可混淆:
- 核心工作网卡:vEthernet (WSL)(对应 172.30.64.1)
- 本质:Hyper-V 为 WSL2 功能创建的专属虚拟交换机,在Windows主机侧的网关接口
- 作用:所有WSL2发行版(含docker-desktop)均接入此虚拟交换机,是WSL与Windows主机、外网通信的核心通道
- 预留网卡: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 为例,完整转发路径:
- Windows侧应用访问
localhost:8080,请求被 Docker Desktop 的Windows用户态代理进程接收 - 代理将流量通过 Hyper-V 虚拟交换机转发至 WSL2 虚拟机的
172.30.65.150:8080 - WSL2内核中,dockerd 配置的 iptables DNAT 规则将 8080 端口流量转发至容器网段
172.17.0.2:80 - 流量经 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地址转换:
- 第一级(容器→WSL2):容器出网流量经 WSL2 内核 iptables SNAT 规则,源IP转换为 WSL2 虚拟机IP
172.30.65.150 - 第二级(WSL2→Windows):WSL2出网流量经 Hyper-V 虚拟交换机NAT转换,源IP转换为 Windows 物理网卡的局域网/公网IP
- 最终外部网络看到的请求源IP为Windows主机的物理网卡IP。
6. 关键特性与常见误区
-
WSL2 网络为NAT模式,非桥接模式
WSL2虚拟机不直接接入物理局域网,IP由Hyper-V虚拟交换机动态分配,重启后可能变化;局域网内其他设备无法直接访问WSL2及容器,需通过Windows端口转发实现。
-
--net=host并非共享Windows主机网络WSL2模式下的
--net=host仅共享docker-desktopWSL2虚拟机的网络命名空间,而非Windows主机的网络,无法直接获取物理网卡IP。 -
host.docker.internal是Docker注入的DNS记录该域名并非系统原生存在,由Docker Desktop内置的DNS劫持实现,仅容器内可解析;原生WSL发行版默认不支持该域名。
-
两块虚拟网卡无关联
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