Windows Docker Desktop 使用 WSL2 后端时,docker-desktop WSL 实例 与 builder-jammy-base:latest 属于完全不同的系统层级与架构角色 ,核心关系是 底层运行宿主层 vs 构建用用户态镜像层,无任何同级可比性。以下为完全准确的结构化对比与说明。
一、核心定义
- docker-desktop :Docker Desktop 自动创建、管理的 WSL2 Linux 发行版实例 ,是跑在 WSL2 轻量级虚拟机内的精简 Linux 用户态系统 ,自身不含 Linux 内核,共享 WSL2 提供的统一 Linux 内核。
- builder-jammy-base:latest :Docker BuildKit 专用的默认构建环境镜像 ,基于 Ubuntu 22.04 (Jammy Jellyfish) 精简定制,仅为用户态文件集合,无任何内核、无启动能力,仅用于镜像构建阶段的编译、打包、依赖下载。
二、维度对比表
| 对比维度 | docker-desktop(WSL2 实例) | builder-jammy-base:latest 镜像 |
|---|---|---|
| 本质定位 | Docker 守护进程的底层宿主运行环境,WSL2 上的专用 Linux 发行版 | Docker BuildKit 专属构建阶段用户态环境镜像,Ubuntu 22.04 定制构建工具集 |
| 核心作用 | 运行 dockerd 守护进程,提供 Linux 系统调用、 Namespace/CGroup 隔离、网络 / 存储管理,是 Windows 上运行所有 Linux 容器的必备母体 |
提供标准化、干净的 Ubuntu 22.04 构建环境,专用于 docker build 过程中的源码编译、镜像构建、中间产物生成 |
| 系统层级 | WSL2 虚拟机之上的Linux 用户态宿主系统,承载 Docker 引擎 | 纯用户态文件层(rootfs),无系统服务、无内核、无守护进程,属于容器镜像层级 |
| 内核依赖 | 无自有内核,完全依赖并共享 WSL2 Linux 内核 | 无任何内核,运行时依赖 docker-desktop 中的 dockerd 与 WSL2 内核 |
| 所属关系 | Docker Desktop 核心底层依赖,Windows 运行 Linux 容器的必需底座 | 存储并运行在 docker-desktop 内部,是被 Docker 引擎管理的普通镜像之一,无它不影响 Docker 基础运行 |
| 是否可替换 / 删除 | 不可删除、不可替换、不可随意修改,由 Docker Desktop 自动部署、升级、维护 | 可随意删除、拉取、替换 ,可改用 ubuntu:22.04、debian、alpine 等任意基础镜像作为构建环境 |
| 进入方式 | wsl -d docker-desktop(进入 WSL 发行版,用于 Docker 底层排错) |
docker run / docker exec(以容器方式运行,用于构建、调试、临时命令执行) |
| 存储职责 | 承载 Docker 全量数据:镜像层、容器运行时、卷、配置、网络、/var/lib/docker 整个目录 |
本身是镜像分层文件,物理存储在 docker-desktop 的 /var/lib/docker/overlay2 下,仅为静态文件集合 |
| 生命周期 | 与 Docker Desktop 启动 / 退出同生命周期,常驻后台 | 仅在docker build或手动docker run时临时创建容器,用完即销毁 |
三、两者关系通俗类比
把 Windows + Docker Desktop + WSL2 类比为一个标准化 Linux 机房:
- WSL2 虚拟机 = 物理服务器硬件 + Linux 内核
- docker-desktop = 服务器上安装好的 Linux 操作系统 + Docker 引擎它是 "母体节点",所有容器、镜像、卷都运行与存储在它里面。
- **builder-jammy-base:latest = 节点上预装的一套「编译打包专用工具盒」**它不是系统、不是引擎,只是一套标准化文件,用来临时开一个 "工作隔间" 做镜像构建,用完就回收。
四、验证场景
场景 1:进入 docker-desktop 查看镜像真实存储
bash
运行
# 进入Docker的WSL宿主环境
wsl -d docker-desktop
# 查看所有镜像(含builder-jammy-base)的分层存储,真实Linux路径
ls /var/lib/docker/overlay2
注意:Windows 侧只能看到虚拟磁盘文件
ext4.vhdx,无法直接读取 / 编辑 overlay2,必须进入 WSL 实例。
场景 2:builder-jammy-base 容器运行的真实流程
执行 docker run -it builder-jammy-base:latest 时:
docker-desktop内的dockerd收到请求;- 从本地镜像库加载
builder-jammy-base的各层 rootfs; - 由 docker-desktop 内的 dockerd 调用 WSL2 提供的 Linux 内核,创建 Namespace、CGroup 隔离,并完成根文件系统挂载
- 启动容器内指定的用户进程(如 bash),该镜像无传统 init 系统
- 容器全程无内核、无硬件驱动、无系统服务,所有系统调用全部透传至 WSL2 内核。
五、补充说明
-
**Windows 侧存储路径(通用版,非写死管理员)**WSL 虚拟磁盘默认路径(与当前用户相关,非固定 Administrator):
plaintext
%LOCALAPPDATA%\Docker\wsl该目录存放
docker-desktop与docker-desktop-data的 VHDX 虚拟磁盘,不是镜像层的直接路径。 -
builder-jammy-base 不可作为生产运行镜像 它是 BuildKit 构建器镜像,体积小、工具专一,不含生产运行依赖、无 systemd、无业务运行组件,仅用于构建阶段。
-
docker-desktop-data 与 docker-desktop 区分
docker-desktop:运行 Docker 引擎、系统服务docker-desktop-data:专门存储/var/lib/docker数据(镜像、容器、卷)二者共同组成 Docker 的 WSL 后端,原文未区分但不影响核心对比,属于进阶细节。
六、态
- 内核态:最高权限,管硬件、资源、调度,崩溃则系统崩溃。
- 用户态:受限权限,跑应用,崩溃不影响系统。
1. WSL2 的内核态在哪里?
WSL2 内核 = 运行在 Hyper-V 轻虚拟机里的 Linux 内核,全权运行在内核态。
- 它管理:CPU、内存、磁盘、网络、Namespace、CGroup、进程调度。
- 这是Windows 上所有 Linux 容器唯一的内核态来源。
2. docker-desktop WSL 实例 处于什么态?
docker-desktop 是 Linux 用户态系统。
- 它里面跑
dockerd、containerd、系统工具。 - 它自身没有内核态权限 ,所有特权操作都要调用 WSL2 Linux 内核,从用户态陷入内核态。
3. 容器(包括 builder-jammy-base 容器)处于什么态?
容器内所有进程 100% 运行在用户态!
- 容器没有自己的内核,无内核态。
- 容器内执行的任何命令(ls、bash、gcc、编译、下载)全是用户态进程。
- 容器想创建文件、网络、进程,都必须通过系统调用,进入WSL2 Linux 内核态完成。
4. builder-jammy-base 镜像为什么只有用户态?
因为镜像 = 一堆用户态文件(rootfs)。
- 镜像不含内核、不含内核态代码、不能执行特权指令、不能直接操控硬件。
- 镜像只是数据,只有被内核态加载、挂载、创建 Namespace 后,才变成容器(用户态进程)。
5. 一句话总结底层逻辑
WSL2 提供Linux 内核态 → docker-desktop 提供Linux 用户态宿主 → dockerd 运行在用户态、通过系统调用进入内核态创建容器 → builder-jammy-base 作为纯用户态镜像,被内核态挂载成容器,全程只在用户态执行业务 / 构建。