在 Windows 上跑 Linux 容器,过去我第一反应就是“先装一台虚拟机”。以前业务里需要本地复现 Linux 环境,我会先打开 VMware,装一个 CentOS,再进虚拟机装 Docker,最后还要配置端口映射和 NAT 规则。一套流程下来,硬盘吃掉几十 GB,启动要等半天,网络还时不时抽风。后来切到 WSL2 + Docker Desktop,日常开发终于能在 Windows 上直接运行 Linux 容器,体验已经非常接近“原生”。
这篇文章不打算只丢几条命令,而是把整件事讲清楚:Windows 为什么以前不能直接跑 Linux 容器,WSL2 是怎么把它变成可能的,环境怎么搭建,一个真实项目怎么跑起来,以及最常见的报错和排查思路。读完你可以直接动手搭出一套可用的环境,也可以把这篇文章当作排查手册收藏备用。
1. 为什么 Windows 上跑 Linux 容器过去那么折腾
1.1 Linux 容器依赖 Linux 内核
很多人把“容器”理解成一个轻量虚拟机,其实不太准确。容器里并没有自己完整的内核,它运行时会共享宿主机内核,通过内核提供的 namespace、cgroup 等机制实现隔离和资源限制。
Linux 容器镜像里的可执行文件、动态库、配置,都是在 Linux 内核基础上编译和运行的。容器的系统调用、进程模型、网络协议栈都来自宿主 Linux 内核。如果把一个 Linux 容器直接放到 Windows 内核上运行,系统调用对不上,镜像里的二进制文件也无法按预期执行。
这就是最根本的矛盾:Windows 内核是 NT 内核,Linux 容器需要 Linux 内核,两边无法直接兼容。
1.2 早期“曲线救国”方案的痛点
在没有 WSL2 之前,主流思路是“包一层虚拟机”,常见有三种做法:
- 方案一:在 VMware Workstation 或 VirtualBox 里安装完整 Linux 系统,再在 Linux 里安装 Docker。这一套最稳,但开销最大,虚拟机本身要占几 GB 到几十 GB 磁盘,内存也要额外分配,启动过程非常慢。
- 方案二:使用 Docker Toolbox。它默认基于 VirtualBox 创建一台 Linux 虚拟机,并在虚拟机里运行 Docker 守护进程。相比手动装系统稍微友好一点,但本质上还是虚拟机方案,性能损失明显,而且旧版本的网络端口转发经常出问题。
- 方案三:Docker Desktop 的 Hyper-V 后端。它在 Windows 的 Hyper-V 平台上启动一个精简 Linux 虚拟机,不显示桌面,用户通过命令行操作。这比前两种体验好很多,但 Hyper-V 保留内存、虚拟机启动时间、磁盘占用依然存在,整体还是“重”。
这些方案都能用,但是都有共同问题:链路长、依赖多、性能打折、排错困难。每次“为什么端口又不通了”“为什么容器时间不对”“为什么磁盘占用这么高”,都要从虚拟化层开始查。
1.3 WSL2 是如何改变现状的
WSL2 的核心变化,是微软在 Windows 里提供了一个轻量级实用工具虚拟机,并在这个虚拟机里运行了一个真正的 Linux 内核。这个内核不是模拟出来的,而是经过微软适配、随 Windows 组件一起分发的 Linux 内核。
由于 WSL2 已经有了 Linux 内核,Docker Desktop 就不需要再单独启动一台 Hyper-V 完整虚拟机。它直接把 Linux 容器跑在 WSL2 的 Linux 内核之上,Windows 侧通过一个轻量客户端与容器交互。
从用户视角看,流程变成了:
- 在 Windows 上安装 WSL2;
- 在 WSL2 里安装 Ubuntu 或其他发行版;
- 安装 Docker Desktop,并选择“使用 WSL 2 后端”;
- 在 PowerShell 或任意终端里执行
docker run,容器就在 Windows 上运行起来。
本质上 Windows 侧还是有一层轻量虚拟化,但比起完整虚拟机,它的启动速度、内存占用和资源消耗都明显更低,日常使用已经感觉不到“先启动一台虚拟机”的过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与版本说明
2.1 基础环境要求
在开始安装之前,先确认自己的机器满足以下条件:
- 操作系统:Windows 10 版本 2004(build 19041)及以上,或 Windows 11;
- CPU 虚拟化:需要在 BIOS/UEFI 中开启虚拟化功能(Intel VT-x 或 AMD-V);
- 内存:建议 8 GB 以上,如果同时运行多个开发环境,推荐 16 GB;
- 磁盘:WSL2 虚拟磁盘和 Docker 镜像都会占用空间,建议预留 20 GB 以上可用空间。
说明一下:这里的“Windows 原生跑 Linux 容器”在实际实现上仍然借助 WSL2 这层轻量虚拟化,它是微软官方提供的能力,不需要我们再手动安装虚拟机软件,所以日常可以把它当成“原生”使用。
2.2 安装并启用 WSL2
在 Windows 11 或较新的 Windows 10 上,可以打开 PowerShell,以管理员身份运行:
powershell复制wsl --install
这条命令会自动完成以下操作:
- 启用“适用于 Linux 的 Windows 子系统”功能;
- 启用“虚拟机平台”功能;
- 下载并安装 WSL2 内核;
- 默认安装 Ubuntu 发行版;
- 将 WSL 默认版本设置为 2。
如果你的系统版本较旧,或者执行 wsl --install 后提示功能不完整,可以手动开启 Windows 功能,然后再安装内核:
powershell复制dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
开启后重启电脑,再从微软官网下载 WSL2 内核更新包安装。
安装完成后,执行以下命令检查状态:
powershell复制wsl --status
wsl -l -v
如果某个发行版的 VERSION 列显示为 1,可以手动升级到 WSL2:
powershell复制wsl --set-version Ubuntu 2
如果提示找不到发行版名称,先用 wsl -l 查看实际名称。
2.3 安装 Docker Desktop 并启用 WSL2 后端
Docker Desktop 官方安装包支持 Windows 平台,安装过程中有一个关键选项:
- “Use WSL 2 based engine”
如果你先安装了 WSL2,这个选项会被自动勾选和推荐使用。不要在安装时取消它。
安装完成后,打开 Docker Desktop,进入 Settings,在 Resources -> WSL Integration 页面,可以看到当前 WSL 发行版列表。把需要集成 Docker 的发行版开关打开,点击 Apply & Restart。
这一步的作用是让 WSL 发行版内的命令行工具能直接访问 Docker Engine,而不是只能通过 Windows 侧客户端访问。
2.4 验证环境
重新打开一个 PowerShell 或 Windows Terminal 窗口,执行:
powershell复制wsl -l -v
docker version
docker compose version
docker version 会同时显示 Client 和 Server 信息。如果 Server 部分能正常输出,说明 Docker Engine 已经通过 WSL2 后端运行起来了。
如果 Server 部分报错,别急着怀疑安装过程,先确认 Docker Desktop 已经启动。Docker Desktop 推荐保持后台运行,因为 Windows 命令行工具本身不负责启动守护进程。
这里需要说明一下版本问题:不同 Docker Desktop 版本、不同 Windows 版本,界面和命令输出可能有差异。文章示例以常见环境为基础,重点展示思路,具体版本请以你本机实际输出的信息为准。
3. 从原理上理解 WSL2 后端
3.1 虚拟机、Linux 容器和 Windows 容器的差异
很多人会混淆虚拟机、Linux 容器、Windows 容器这三者的关系。我们可以用一个简单表格区分:
| 维度 | 传统虚拟机 | Linux 容器 | Windows 容器 |
|---|---|---|---|
| 内核 | 每台虚拟机有独立客户机内核 | 共享宿主 Linux 内核 | 共享宿主 Windows 内核 |
| 启动速度 | 慢,按分钟计 | 快,按秒计 | 较快,但依赖 Windows 基础镜像 |
| 隔离级别 | 强,硬件级隔离 | 进程级隔离 | 进程级隔离 |
| Windows 上运行方式 | Hyper-V / VMware / VirtualBox | 需要 Linux 内核,常见通过 WSL2 | 需要 Windows Server 容器功能 |
在 Windows 上直接运行 Linux 容器,关键就是“先提供一个 Linux 内核”。WSL2 正是微软提供这层内核的官方方案。
3.2 Docker Desktop 与 WSL2 的协作流程
Docker Desktop 启用 WSL2 后端后,会在 WSL 中创建两个专用发行版,名字通常是:
- docker-desktop
- docker-desktop-data
这两个发行版负责维护 Docker 引擎运行所需的内部环境。用户日常使用的 Ubuntu 发行版,则通过 WSL Integration 与 Docker 通信。
整体流程可以理解为:
- 用户在 PowerShell 输入
docker run nginx; - Windows 侧 docker.exe 客户端找到 Docker Desktop 暴露的 socket;
- Docker Desktop 将请求转发到 WSL2 内的 Docker Engine;
- Docker Engine 在 WSL2 的 Linux 内核上创建容器。
所以,虽然在 Windows 桌面上操作,但容器真正运行的位置是 WSL2 环境内。Windows 侧不需要再单独开一台“用户可见”的虚拟机,这正是它比传统方案轻量的原因。
3.3 WSL2 的文件系统与网络特点
WSL2 的文件系统和 Windows 文件系统并不一样。WSL2 内部使用 ext4 文件系统,虚拟磁盘保存在 Windows 侧的一个 VHDX 文件中。
在 WSL 发行版内部,可以通过以下路径访问 Windows 文件:
text复制/mnt/c/Users/你的用户名/Desktop
在 Windows 侧,则可以通过网络路径访问 WSL 文件:
text复制\\wsl$\Ubuntu\home\你的用户名
这里有一个非常重要的实践建议:跨文件系统读写性能差别很大。如果代码仓库放在 Windows 的 D 盘,然后在 WSL 里编译运行,涉及大量文件读写时速度会明显偏慢。更推荐把项目代码放到 WSL 的 Linux 文件系统内,例如 /home/你的用户名/projects,这样会快很多。
WSL2 默认使用 NAT 网络模式,Windows 访问 WSL 内部服务时,WSL 会自动做 localhost 转发。比如 WSL 里的容器把端口映射到 8080,那么在 Windows 浏览器访问 http://localhost:8080 通常可以直达。
较新的 WSL 版本还支持 mirrored 网络模式,可以让 WSL 直接共享 Windows 的网络接口,在 IPv6、局域网访问等场景下更接近“同一台机器”。该模式需要较新的 WSL 版本支持,启用方式是在 .wslconfig 中配置网络模式,后面会讲到。
4. 完整实战:在 Windows 上跑起一套 Linux 服务
下面用一个实际项目验证整条链路。我们会在 Windows 上通过 Docker Compose 启动三个 Linux 容器:
- Nginx:提供静态页面服务;
- MySQL:提供数据库服务;
- Redis:提供缓存服务。
这套组合很常见,也足够演示容器端口映射、数据卷持久化、容器间网络通信几个关键能力。
4.1 创建项目结构
建议在 WSL2 的 Ubuntu 文件系统内创建项目,避免跨文件系统性能问题。在 WSL 终端中执行:
bash复制mkdir -p ~/projects/linux-container-demo/nginx
cd ~/projects/linux-container-demo
如果是第一次使用 WSL 终端,可以直接在 Windows Terminal 里选择 Ubuntu 发行版标签页,或者用 PowerShell 执行 wsl 进入默认发行版。
项目结构如下:
text复制linux-container-demo/
├── docker-compose.yml
├── nginx/
│ └── index.html
└── README.md
4.2 编写 docker-compose.yml
在项目根目录创建 docker-compose.yml,内容如下:
yaml复制services:
nginx:
image: nginx:1.27-alpine
container_name: demo-nginx
ports:
- "8080:80"
volumes:
- ./nginx:/usr/share/nginx/html:ro
networks:
- demo-net
mysql:
image: mysql:8.4
container_name: demo-mysql
environment:
MYSQL_ROOT_PASSWORD: root123456
MYSQL_DATABASE: demo
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
networks:
- demo-net
redis:
image: redis:7.4-alpine
container_name: demo-redis
ports:
- "6379:6379"
networks:
- demo-net
volumes:
mysql-data:
networks:
demo-net:
这段配置有几个关键点需要解释:
nginx服务把容器内的 80 端口映射到 Windows 主机的 8080 端口,外部访问localhost:8080即可;./nginx:/usr/share/nginx/html:ro将本地nginx目录挂载到容器内,:ro表示只读;mysql-data是命名卷,MySQL 数据不会因为容器删除而丢失;demo-net是自定义 bridge 网络,三个容器可以通过服务名相互访问,例如在 Nginx 容器中可以通过mysql:3306访问数据库;MYSQL_ROOT_PASSWORD是环境变量,首次启动 MySQL 时会用它初始化数据库。这里的密码只是本地演示,生产环境一定要换成强密码,并通过环境变量或密钥管理工具传入,不能明文写在文件里。
镜像标签可以根据实际环境调整,例如 mysql:8.0、redis:7.2-alpine 都是常见选择。建议优先使用明确的版本标签,避免直接在编写阶段追求某个“最新版”。
4.3 编写 Nginx 测试页面
创建 nginx/index.html:
html复制<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Windows 上的 Linux 容器</title>
</head>
<body>
<h1>Hello from Linux Container</h1>
<p>这个页面运行在 Windows + WSL2 环境的 Nginx 容器中。</p>
</body>
</html>
加上这个页面,是为了稍后能从浏览器直观确认 Nginx 容器真的在运行。
4.4 启动容器并验证
在项目根目录执行:
bash复制docker compose up -d
-d 表示后台运行。启动过程会先拉取镜像,视网络情况可能需要一些时间。
查看容器状态:
bash复制docker compose ps
理想情况下能同时看到三个容器处于 Up 状态。这里可能还需要查看容器日志,避免个别容器启动失败:
bash复制docker compose logs -f
容器启动完成后,在 Windows 浏览器访问:
text复制http://localhost:8080
如果能看到 “Hello from Linux Container”,说明 Nginx 容器已经通过 WSL2 在 Windows 上正常运行。
4.5 验证数据库连接和数据持久化
进入 MySQL 容器,确认数据库初始化成功:
bash复制docker exec -it demo-mysql mysql -uroot -p
输入 root 密码后,执行:
sql复制show databases;
能看到 demo 数据库,说明初始化脚本生效。此时可以创建一张测试表:
sql复制use demo;
create table t_user (id int primary key auto_increment, name varchar(50));
insert into t_user(name) values ('wsl2');
select * from t_user;
然后退出 MySQL,重启整套容器:
bash复制docker compose down
docker compose up -d
再进入 MySQL 执行 select * from t_user;,数据仍然存在。这就是命名卷的作用:容器删除了,数据保留在卷里。
验证 Redis 也很简单:
bash复制docker exec -it demo-redis redis-cli ping
出现 PONG 说明 Redis 服务正常响应。
到这一步,你已经完整跑通了一份“在 Windows 上运行 Linux 容器”的项目链路。
5. 另一条路线:直接在 WSL 发行版里安装 Docker Engine
Docker Desktop 提供了很友好的图形界面,但它并不是唯一选择。如果你更想贴近服务器环境,可以直接在 WSL2 的 Ubuntu 发行版里安装 Docker Engine,玩法更接近生产环境。
这种方式相当于把 WSL 发行版当成一台 Linux 服务器,在里面执行标准的 Linux 安装命令。
5.1 启用 systemd
较新的 WSL2 版本支持 systemd,但默认可能没有开启。编辑 /etc/wsl.conf:
bash复制sudo vi /etc/wsl.conf
加入以下内容:
ini复制[boot]
systemd=true
然后在 Windows PowerShell 里执行:
powershell复制wsl --shutdown
重新打开 WSL 终端后,用下面命令确认 systemd 已启动:
bash复制systemctl list-units --type=service
如果你验证时报错说 systemd 不可用,需要先确认 WSL 版本足够新。可以在 Windows PowerShell 里执行 wsl --update 升级。
注意:这一步影响的是你当前这台 WSL 发行版里的服务管理方式,不影响 Windows 本机和 Docker Desktop。修改 /etc/wsl.conf 前建议先备份,改坏了想恢复时可以直接把文件内容清空。
5.2 安装 Docker Engine
在 Ubuntu 的 WSL 终端中执行:
bash复制sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker
docker version
安装完成后,docker version 会显示 Client 和 Server 信息。这里的 Server 就是运行在 WSL Linux 内核上的 Docker Engine。
执行一个简单容器验证:
bash复制docker run --rm hello-world
如果输出正常,说明这条“不用 Docker Desktop,直接在 WSL 里跑 Docker”的路线也通了。
需要特别注意:系统里同时存在 WSL 内 Docker Engine 和 Docker Desktop 时,docker context 可能会混在一起。docker 命令默认会读取当前 context。两种方式并用时,建议明确当前上下文:
bash复制docker context ls
如果不确定自己当前用的是哪个环境,用这个命令查看,避免出现“在 Docker Desktop 里看不到 WSL 容器”或反之的情况。
5.3 Podman Desktop 路线
除了 Docker 生态,Podman 也可以作为容器运行时。Podman Desktop 是图形化工具,Podman 自身设计为无守护进程架构,在 Windows 上通过 Podman Machine 创建一个 Linux 虚拟机来运行容器。它的命令大多兼容 Docker CLI,如果你对 Docker 之外的工具链感兴趣,可以单独试用。本文后续内容仍然围绕 Docker 生态展开。
6. 常见问题与排查思路
6.1 问题速查表
下面把 Windows 上运行 Linux 容器过程中出现频率较高的问题整理成表,方便快速定位:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| WSL 发行版显示版本为 1 | 没有升级到 WSL2 | 执行 wsl --set-version <名称> 2 |
docker 命令无法识别 |
Docker Desktop 未启动或环境变量未生效 | 启动 Docker Desktop,重开终端 |
| Server 部分不显示版本 | Docker Engine 未运行 | 确认 Docker Desktop 已启动 |
docker compose 命令不存在 |
Compose 插件缺失 | 高版本 Docker 自带 Compose,低版本需单独安装 |
| 启动容器端口被占用 | Windows 侧有进程占用端口 | 用 netstat -ano 查看并处理 |
| 容器无法访问 Windows 宿主机服务 | WSL2 NAT 网络限制 | 使用 host.docker.internal 或调整网络模式 |
| 跨文件读写很慢 | 代码放在 /mnt/c 下 |
迁移到 WSL 本地文件系统 |
| WSL2 内存占用过高 | 未限制内存 | 使用 .wslconfig 限制内存 |
6.2 典型报错:Windows 守护进程与权限问题
在维护群和社区里经常能看到一个报错,长这样:
text复制error: start the windows daemon from a non-elevated terminal; shared clients
这类报错常见于当前 PowerShell 终端不是以管理员身份运行,而 Docker Desktop 的 Windows 守护进程组件需要更高权限来工作。负责和 WSL2 通信的 Windows 侧组件对权限比较敏感,普通权限终端里执行某些操作时可能被拒绝。
建议按以下顺序排查:
- 关闭当前所有终端;
- 以管理员身份打开 PowerShell 或 Windows Terminal;
- 确认 Docker Desktop 已经启动并运行稳定;
- 再次执行
docker version和docker ps; - 如果依然报错,在 Docker Desktop 设置中检查与 WSL 集成、共享权限相关的选项,退出 Docker Desktop 后重启。
另外检查当前 docker context:
bash复制docker context ls
docker context show
如果 context 指向了某个不存在的端点,也会出现“明明装了 Docker 但连不上守护进程”的假象。
6.3 WSL2 内存和 CPU 限制
WSL2 默认会使用相当比例的系统资源,一旦容器多起来,经常出现内存被占满、电脑卡顿的情况。可以通过 .wslconfig 限制资源。
在 Windows 用户目录下创建或编辑 .wslconfig 文件,路径类似于:
text复制C:\Users\你的用户名\.wslconfig
内容示例:
ini复制[wsl2]
memory=6GB
processors=4
swap=2GB
localhostForwarding=true
各字段含义:
memory:WSL2 最大内存,建议设置为物理内存的 50% 左右;processors:WSL2 最多使用的 CPU 核数;swap:交换分区大小;localhostForwarding:是否允许 Windows 通过 localhost 访问 WSL 服务,默认开启。
修改后执行以下命令生效:
powershell复制wsl --shutdown
然后重新打开 WSL 终端。注意:如果 Docker Desktop 正依赖 WSL2 运行,wsl --shutdown 会把 Docker Desktop 的容器一并停掉,重启之后需要重新启动 Docker Desktop 和容器。
如果是 Windows 11 和较新的 WSL 版本,还可以启用 mirrored 网络模式:
ini复制[wsl2]
networkingMode=mirrored
这个模式可以让 WSL 的网络更接近宿主机网络,更适合需要局域网内直连的场景。但该模式对 WSL 版本、Windows 版本都有要求,启用前建议先查看 wsl --version 输出,并参考微软官方文档确认支持情况。
6.4 host 网络模式在 Windows 上的限制
在 Linux 服务器上,Docker 可以用 --network host 让容器直接共享宿主机网络。但在 Windows + WSL2 环境下,“宿主机”这个概念需要重新理解。
容器真正运行在 WSL2 的 Linux 内核上,对容器来说,它的“宿主机”是 WSL2 虚拟机,而不是 Windows。所以执行 --network host 后,容器访问的是 WSL2 的网络命名空间,并不等价于直接暴露到 Windows 物理机网络。
如果需要对外提供服务,实践上更稳妥的方式是使用端口映射,例如:
bash复制docker run -d -p 8080:80 nginx:1.27-alpine
如果需要容器访问 Windows 上的某个服务,通常会用到 host.docker.internal 这个特殊地址。它由 Docker Desktop 提供,会自动解析为宿主机地址。
如果你确实需要复杂网络拓扑,比如宿主机局域网内直接访问容器,建议先确认你的 WSL 版本支持 mirrored 模式,然后修改 .wslconfig 并重新启动测试。不要太指望在 Windows 环境里复刻 Linux 服务器上的所有 host 网络行为,两者模型并不完全一致。
6.5 数据卷与备份
容器本身是无状态的,启动一个 Nginx 容器很容易,但数据库数据如果放在容器可写层,容器一删数据就没了。生产习惯是把数据放在卷或挂载目录中。
遇到数据卷相关问题时,可以检查以下几点:
- 使用
docker volume ls查看卷是否存在; - 使用
docker volume inspect查看卷挂载点; - 定期导出数据库备份,不要完全依赖容器环境;
- 删除无用的容器时,可以用
docker compose down -v保留卷,或者明确确认后删除卷。
7. 最佳实践与工程建议
7.1 开发环境要贴近生产环境
你现在是在 Windows 上跑 Linux 容器,但生产服务器很可能是 Linux。建议从第一天开始,就把容器作为交付单元:
- 在 Windows 上开发调试;
- 通过 Dockerfile 构建镜像;
- 保证同一个镜像在 Windows 开发环境和 Linux 生产环境上使用相同方式运行。
这样能大幅减少“本地能跑,服务器跑不了”的尴尬情况。
编写 Dockerfile 时,基础镜像尽量选官方镜像或受信任的镜像仓库,并固定版本标签,避免使用 latest。镜像加入健康检查命令,容器编排时也建议配置 restart 策略。
7.2 数据持久化和备份策略
数据库容器一定要把数据落在卷里,不要依赖容器层。建议:
- 给数据库服务单独配置命名卷或挂载目录;
- 定期执行数据库导出命令,例如 MySQL 的
mysqldump; - 容器升级前先导出备份,升级后对比数据;
- 不要在生产环境随意执行
docker compose down -v,这会把卷一起删掉。
7.3 镜像与容器安全
本地开发可以相对宽松,但要保证不把坏习惯带到生产环境:
- 不要在镜像中直接放数据库密码;
- 不要把
.env文件提交到 Git 仓库; - 尽量使用非 root 用户运行容器进程;
- 给容器配置最小权限,比如只读根文件系统、限制能力;
- 定时更新基础镜像,修复已知漏洞;
- 不随意运行来路不明的镜像。
如果团队规模较大,建议在 CI 阶段配置镜像扫描工具。即使只在本机使用,也至少要养成查看镜像来源的习惯。
7.4 文件放置策略
前面提过,WSL2 和 Windows 文件系统之间存在性能差异。这里给出更具体的建议:
- 项目代码放在 WSL 的 Linux 文件系统内,比如
/home/你的用户名/projects/; - 工具链、依赖缓存、容器构建上下文也放在 WSL 内;
- 日常文档、备份文件放在 Windows 文件系统,通过
/mnt/c路径访问; - 如果项目必须放在 Windows 侧,则优先考虑把构建上下文和中间文件输出到 WSL 侧,减少频繁跨系统读写。
7.5 系统与软件的更新节奏
WSL2、Docker Desktop 更新速度都不慢,建议保持适度更新,但不要生产环境追新:
- 在服务器上使用稳定版 Docker Engine;
- 本地开发机可以使用较新的 Docker Desktop,尽早发现兼容问题;
- 大版本升级前,先看更新说明和已知问题,再决定是否升级。
8. 总结与下一步
到这里,你已经理解了 Windows 不能直接运行 Linux 容器的根本原因,也知道 WSL2 是如何通过轻量级 Linux 内核解决这个问题的。环境搭建方面,我们分别展开了 Docker Desktop 和 WSL 内直接安装 Docker Engine 两条路线;项目实战方面,用一套 Nginx + MySQL + Redis 的例子演示了端口映射、数据卷和容器网络;排错方面,整理了权限、端口、内存、网络模式等常见问题。
如果你刚开始,建议按下面的顺序继续深入学习:
- 熟练编写 Dockerfile,掌握多阶段构建和镜像瘦身;
- 掌握 docker compose 的常用指令和扩展字段,能够编排一套完整服务;
- 学习容器网络模型,理解 bridge、host、none 之间的关系;
- 了解镜像仓库的搭建与镜像分发流程;
- 在 CI/CD 中集成镜像构建与部署,让开发、测试、生产共用同一个产物。
把这篇文章收藏起来,等你在 Windows 上部署 Linux 容器遇到问题时,按照第 6 章的排查表和 7.2、7.3 节的工程建议逐项检查,大部分问题都能快速定位。如果遇到文末没覆盖到的报错,建议先看日志,再确认版本,最后去官方文档查变更记录。
