ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WSL2 + Ubuntu 20.04 + Docker 原生部署指南

WSL2 + Ubuntu 20.04 + Docker 原生部署指南 简介本资源是一份面向Windows开发者与Linux容器化初学者的实操指南聚焦在Windows 102004及以上版本中部署WSL2 Ubuntu 20.04并完整配置Docker开发环境的全流程方案。内容覆盖WSL功能启用、内核更新、Ubuntu系统安装、国内镜像源替换、Docker CE安装及基础验证等关键环节并包含字体配置、zsh环境初始化等实用增强步骤显著提升开发体验与执行效率。资源为单文件PDF文档190KB结构清晰、命令可直接复用适合作为离线查阅手册或快速搭建本地容器开发环境的参考依据。目前已有6734人学习下载内容兼顾操作严谨性与新手友好性特别适合需在Windows平台开展云原生、微服务或CI/CD本地验证的中初级开发者。1. WSL2 Ubuntu 20.04 Docker为什么我在 Windows 10 上放弃双系统和虚拟机只用这三步就跑通了生产级 Python 工程环境你是不是也经历过在 Windows 10 上跑 PyTorch 训练脚本conda 环境反复冲突想用 Docker Compose 启一个带 PostgreSQL Redis FastAPI 的本地微服务栈却卡在 Docker Desktop 启动失败、报错 “virtualization support not detected”或者试过 VMware 安装 Ubuntu 20.04结果显卡驱动不认、共享文件夹权限混乱、休眠后 WSL2 服务全挂——最后发现真正稳定、低开销、能直连 Windows 文件系统、还能调用 GPU后续可扩展的方案根本不是虚拟机也不是 Hyper-V 原生 VM而是WSL2 底层跑 Ubuntu 20.04再原生部署 Docker Engine非 Docker Desktop。这不是“玩具环境”我用它支撑了三个上线项目一个基于 LangChain 的 RAG 服务、一个用 OpenCVYOLOv5 的工业质检流水线、还有一个对接企业内网 Kafka 的实时日志解析器。关键在于——它不依赖 Windows GUI 层不抢资源不改 BIOS不碰 Secure Boot只要你的 Win10 是 2004 及以上版本19041就能在 15 分钟内完成从零到docker run hello-worldpython3 -c import torch; print(torch.cuda.is_available())后续配 CUDA。适合所有不想重装系统、又拒绝忍受 Cygwin/MinGW 兼容性玄学的 Windows 开发者、数据工程师和边缘 AI 部署人员。2. 从 Windows 10 内核启用到 Ubuntu 20.04 实例落地四步不可跳过的底层准备WSL2 不是应用层软件它是 Windows 内核级的轻量虚拟化子系统。跳过这四步中的任意一步后面所有操作都会在某个环节突然卡死——比如wsl --install报错 “WSL2 kernel update is required”或 Ubuntu 启动后systemd无法启动导致dockerd根本起不来。我踩过三次坑血泪经验是必须按顺序、逐条验证、手动补全不能依赖wsl --install一键包。2.1 确认 Windows 10 版本与内核更新状态不是看“关于”页面而是查 Build Number打开 PowerShell管理员执行Get-ComputerInfo | Select-Object WindowsVersion, OsHardwareAbstractionLayer, WindowsBuildLabEx提示输出中WindowsBuildLabEx字段必须包含19041或更高如19045,22621。若低于19041说明你还在 20H1 之前版本必须升级 Windows 10 至 2004 或更高通过 Windows Update → 检查更新 → 下载功能更新。注意某些 OEM 预装机如戴尔 5TJF1可能被厂商锁住更新通道此时需手动下载 Windows 10 更新助手 强制升级。验证内核是否已安装最新版关键很多用户卡在这步# 查看当前 WSL2 内核版本 wsl --status # 输出应类似Default Version: 2, Kernel Version: 5.10.102.1 # 若 Kernel Version 显示为空或低于 5.10.60说明未安装 WSL2 Linux 内核更新包手动下载并安装官方内核更新包微软源无第三方风险# 下载地址2024 年仍有效 # https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi # 或直接用 PowerShell 下载安装推荐 Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile $env:TEMP\wsl_update.msi Start-Process msiexec.exe -ArgumentList /i $env:TEMP\wsl_update.msi /quiet -Wait安装完成后必须重启电脑不是注销是完整重启否则内核不生效。2.2 手动启用 WSL 与虚拟机平台绕过wsl --install的静默失败wsl --install在部分企业域控环境或禁用 Hyper-V 的机器上会静默失败。我们采用分步手动启用# 以管理员身份运行 PowerShell逐条执行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart # ⚠️ 注意这两条命令必须都成功且 /norestart 是为了统一控制重启时机启用后下载并安装 WSL2 Linux 内核更新包见 2.1→ 重启电脑 → 再设置 WSL2 为默认版本wsl --set-default-version 2 # 验证输出应为 The operation completed successfully.参数说明/featurename:VirtualMachinePlatform是 WSL2 的底层依赖它不同于传统 Hyper-V无需开启 Hyper-V 管理工具但需要 CPU 支持 SLAT绝大多数 Intel Core i3/i5/i7/i9 及 AMD Ryzen 均支持。若执行dism命令报错 “Error: 0x800f080c”说明 BIOS 中 Virtualization TechnologyVT-x/AMD-V未开启请进 BIOS开机按 F2/F12/Del开启保存退出。2.3 从 Microsoft Store 安装 Ubuntu 20.04而非 wsl --install ubuntuwsl --install -d Ubuntu-20.04在国内网络环境下极大概率卡在下载阶段wsl2下载慢 是高频热词根源是 Store CDN 走全球节点。更可靠的做法是打开 Microsoft Store 应用搜索 “Ubuntu 20.04 LTS”注意必须选 Canonical 官方发布Publisher 是 “Canonical Group Limited”不是第三方打包版点击“获取”等待安装完成通常 2–5 分钟比命令行快且稳定安装完成后不要直接点击启动先在 PowerShell 中确认发行版已注册wsl -l -v # 正常输出应类似 # NAME STATE VERSION # * Ubuntu-20.04 Stopped 2若显示STATE为Stopped说明安装成功但尚未初始化。2.4 初始化 Ubuntu 20.04 并配置 root 权限为后续 Docker 安装铺路首次启动 Ubuntu 20.04 时Store 会引导你创建普通用户如user1但 Docker 守护进程需要root权限且 WSL2 默认不启用systemdDocker 推荐运行模式因此我们必须启动 Ubuntu 并设 root 密码修改/etc/wsl.conf启用systemd关键否则sudo service docker start无效设置默认用户为 root避免每次 sudo 输密码。操作步骤# 在 PowerShell 中启动 Ubuntu会触发首次初始化 wsl -d Ubuntu-20.04 # 在 Ubuntu 终端内执行设置 root 密码 sudo passwd root # 退出 Ubuntu回到 PowerShell exit # 创建 /etc/wsl.conf此文件默认不存在必须手动创建 # 注意必须在 Windows 下用管理员记事本或 VS Code 创建编码为 UTF-8 无 BOM # 路径\\wsl$\Ubuntu-20.04\etc\wsl.conf # 内容如下[boot] systemdtrue [user] defaultroot逻辑说明systemdtrue告诉 WSL2 在启动时加载 systemd init 系统这是 Docker daemon 正常运行的前提defaultroot避免每次进入都切用户。此文件必须保存在 Ubuntu 文件系统根目录的/etc/下且 WSL2 实例必须完全关闭后重启才生效。关闭方式wsl --shutdown然后重新wsl -d Ubuntu-20.04。验证systemd是否生效# 进入 Ubuntu 后执行 ps -p 1 -o comm # 正常应输出systemd而非 bash 或 init systemctl list-unit-files | grep docker # 初次应无输出因为 Docker 尚未安装但命令不报错即表示 systemd 已就位3. 在 WSL2 Ubuntu 20.04 中原生安装 Docker Engine绕过 Docker Desktop 的全部陷阱Docker Desktop 是 Windows 图形应用它依赖 Hyper-V 和 Windows 服务在 WSL2 环境下不仅多一层抽象、吃内存常驻 1.2GB还会与 WSL2 的systemd冲突常见报错docker desktop failed to start because virtualisation support wasnt detected。而Docker Engine 是纯 CLI 守护进程直接跑在 WSL2 的 Linux 内核上资源开销 200MB启动秒级且与systemd完全兼容。这才是 WSL2 Ubuntu 的正确打开方式。3.1 卸载残留 Docker Desktop 并清理环境必做否则端口冲突如果你曾安装过 Docker Desktop请彻底卸载控制面板 → 卸载程序 → 找到 “Docker Desktop” → 卸载删除残留配置在 PowerShell 中执行Remove-Item -Recurse -Force $env:LOCALAPPDATA\Docker Remove-Item -Recurse -Force $env:APPDATA\Docker # 清理 WSL2 中可能存在的旧 Docker 二进制 wsl -d Ubuntu-20.04 -u root -e sh -c apt remove -y docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker原因说明Docker Desktop 会在 WSL2 中注入自己的dockerd并监听localhost:2375而原生 Docker Engine 默认也用该端口。不清除会导致docker info报错 “Cannot connect to the Docker daemon”。3.2 使用官方 APT 源安装 Docker Engine非 snap非 curl 脚本Ubuntu 20.04 自带的apt install docker.io版本太老20.10不支持buildx和compose v2。必须使用 Docker 官方 APT 仓库# 在 Ubuntu 终端中root 用户下执行 apt update apt upgrade -y # 安装必要依赖 apt install -y ca-certificates curl gnupg lsb-release # 添加 Docker 官方 GPG 密钥注意必须用 curl不能用 wget因证书链要求 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加 stable 仓库Ubuntu 20.04 codename 是 focal echo \ deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | tee /etc/apt/sources.list.d/docker.list /dev/null # 更新源并安装 Docker Engine指定 24.0.x 版本兼容 Ubuntu 20.04 apt update apt install -y docker-ce5:24.0.7~3-0~ubuntu-focal docker-ce-cli5:24.0.7~3-0~ubuntu-focal containerd.io docker-buildx-plugin docker-compose-plugin # 验证安装 docker --version # 应输出Docker version 24.0.7, build afdd53b参数说明5:24.0.7~3-0~ubuntu-focal是截至 2024 年 6 月 Ubuntu 20.04 最稳定的 Docker CE 版本。docker-buildx-plugin和docker-compose-plugin是现代 Docker CLI 插件架构必需组件替代了旧版docker-compose独立二进制。3.3 配置 Docker Daemon 并启用自动启动systemd 模式Docker Engine 默认不随 WSL2 启动需通过systemd注册服务# 创建 systemd service 文件Docker 官方不提供需手动 cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service containerd.service Wantsnetwork-online.target Requirescontainerd.service [Service] Typenotify ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways StartLimitBurst3 StartLimitInterval60s LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity TasksMaxinfinity OOMScoreAdjust-300 [Install] WantedBymulti-user.target EOF # 重载 systemd 配置 systemctl daemon-reload # 启用服务下次 WSL2 启动时自动运行 systemctl enable docker # 立即启动 systemctl start docker # 验证状态 systemctl status docker # 正常应显示active (running)且 Loaded 行含 enabled逻辑说明此 service 文件严格遵循 Docker 官方 systemd 模板关键点在于-H fd://使用 systemd socket 激活和--containerd/run/containerd/containerd.sock指向 WSL2 内置 containerd。若省略--containerd参数Docker 会尝试自己启动 containerd导致端口冲突。3.4 验证 Docker 运行并解决 Windows 主机访问问题localhost ≠ WSL2 IP在 WSL2 中执行docker run hello-world成功仅表示引擎工作。但开发中常需从 Windows 浏览器访问容器如http://localhost:8000而 WSL2 的localhost与 Windows 主机localhost不互通WSL2 使用虚拟 NAT 网络IP 动态分配。解决方案是方法一推荐用 WSL2 的 IP 地址访问在 Ubuntu 中执行ip addr show eth0 | grep inet | awk {print $2} | cut -d/ -f1 # 输出类似172.28.128.123然后在 Windows 浏览器中访问http://172.28.128.123:8000。方法二自动映射配置 Windows Hosts WSL2 端口转发在 PowerShell管理员中执行每次 WSL2 重启后需重跑# 获取 WSL2 IP $wslIp wsl -d Ubuntu-20.04 -u root -e sh -c ip addr show eth0 | grep inet | awk {print \$2} | cut -d/ -f1 # 将端口 8000 转发到 WSL2 netsh interface portproxy add v4tov4 listenport8000 listenaddress127.0.0.1 connectport8000 connectaddress$wslIp此后http://localhost:8000即可访问 WSL2 中容器。避坑重点不要试图修改 WSL2 的/etc/hosts或 Windows 的C:\Windows\System32\drivers\etc\hosts来映射localhost—— WSL2 的网络栈不响应 Windows hosts 解析。4. 常见问题排查五条真实翻车记录与对应解法附错误日志定位WSL2 Ubuntu 20.04 Docker 组合看似简单实则每个环节都有隐蔽陷阱。以下是我和团队在 12 个实际项目中遇到的最高频、最致命的五类问题每条均附原始报错、根因分析和一行命令级解法。4.1 现象wsl --install报错 “WSL2 requires an update to its kernel component”但已安装最新内核现象执行wsl --install提示内核需更新wsl --status显示 Kernel Version 为空原因Windows Update 未真正应用内核更新或wsl --update命令被代理/防火墙拦截尤其企业网络解决# 强制从微软源下载并安装绕过 Windows Update 缓存 Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile $env:TEMP\wsl_update.msi Start-Process msiexec.exe -ArgumentList /i $env:TEMP\wsl_update.msi /quiet -Wait shutdown /r /t 04.2 现象Ubuntu 启动后systemctl报错 “Failed to get D-Bus connection: Operation not permitted”现象systemctl status docker提示无法连接 D-Bus原因/etc/wsl.conf未正确创建或文件编码为 UTF-8 with BOM记事本默认或 WSL2 实例未完全关闭wsl --shutdown未执行解决# 在 Windows 中用 VS Code 新建文件粘贴 wsl.conf 内容保存为 UTF-8无 BOM # 然后强制重启 WSL2 wsl --shutdown wsl -d Ubuntu-20.04 ps -p 1 -o comm # 必须输出 systemd4.3 现象docker run hello-world报错 “Cannot connect to the Docker daemon at unix:///var/run/docker.sock”现象Docker CLI 找不到守护进程 socket原因systemd未启动docker.service或dockerd进程崩溃常见于/var/lib/docker权限错误解决# 检查服务状态 systemctl status docker # 若 inactive手动启动并查看日志 systemctl start docker journalctl -u docker -n 50 --no-pager # 若日志含 permission denied on /var/lib/docker修复权限 chown -R root:root /var/lib/docker systemctl restart docker4.4 现象Docker 容器内无法解析域名ping google.com超时现象容器curl http://httpbin.org失败但宿主机网络正常原因WSL2 的 DNS 配置未同步到容器/etc/resolv.conf被 Docker 覆盖为8.8.8.8但该 DNS 在 WSL2 NAT 网络中不可达解决# 编辑 Docker daemon 配置强制使用 WSL2 的 DNS echo {dns:[172.28.128.1]} /etc/docker/daemon.json systemctl restart docker # 注172.28.128.1 是 WSL2 的默认网关 IP可通过 ip route | awk /default/ {print $3} 获取4.5 现象Windows 主机访问http://localhost:8000返回连接被拒绝但curl http://172.28.128.123:8000成功现象端口转发失效原因Windows 防火墙阻止了netsh portproxy规则或listenaddress127.0.0.1被限制Win10 默认允许解决# 删除旧规则并重建管理员 PowerShell netsh interface portproxy reset $wslIp wsl -d Ubuntu-20.04 -u root -e sh -c ip addr show eth0 | grep inet | awk {print \$2} | cut -d/ -f1 netsh interface portproxy add v4tov4 listenport8000 listenaddress127.0.0.1 connectport8000 connectaddress$wslIp # 检查规则是否生效 netsh interface portproxy show v4tov45. 进阶技巧让 WSL2 Ubuntu 20.04 成为真正的生产力环境GPU、换源、持久化装完 Docker 只是起点。要让它扛住真实项目负载如comfyui qwen-image 2.1这类模型推理服务还需三处关键加固CUDA 支持非必须但强烈建议、国内源加速、以及跨 Windows 重启的配置持久化。这些不是“锦上添花”而是决定你能否每天少花 2 小时在环境重装上的核心能力。5.1 为 WSL2 Ubuntu 20.04 启用 NVIDIA CUDA无需重装驱动复用 Windows 显卡WSL2 的 CUDA 支持是微软与 NVIDIA 联合实现的“透明层”不需要在 Ubuntu 中安装 NVIDIA 驱动那是物理 GPU 时代的老做法只需安装cuda-toolkit和nvidia-cuda-toolkit包并确保 Windows 端已装好对应版本的 NVIDIA 驱动 515.65.01。验证 Windows 驱动版本nvidia-smi # 在 PowerShell 中执行输出 Driver Version 应 ≥ 515.65在 Ubuntu 中安装 CUDA 工具链注意不是nvidia-driver# 添加 NVIDIA CUDA APT 源Ubuntu 20.04 focal wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb dpkg -i cuda-keyring_1.0-1_all.deb apt update # 安装 CUDA Toolkit11.8 是 Ubuntu 20.04 最稳版本 apt install -y cuda-toolkit-11-8 # 验证 nvidia-smi # 应输出与 Windows 端一致的 GPU 信息 nvcc --version # 应输出 Cuda compilation tools, release 11.8, V11.8.89 # 测试 PyTorch CUDA需先 pip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 python3 -c import torch; print(torch.cuda.is_available(), torch.cuda.device_count()) # 正常输出True 1关键提示CUDA 版本必须与 PyTorch wheel 匹配。torch1.13.1cu117对应 CUDA 11.7但 WSL2 Ubuntu 20.04 的cuda-toolkit-11-8兼容 cu117NVIDIA 官方保证向后兼容。不要装cuda-toolkit-12.x它不支持 Ubuntu 20.04。5.2 Ubuntu 20.04 换源加速清华源 阿里云双备份Ubuntu 官方源在国内极慢ubuntu20.04下载 是高频热词且apt update经常超时。必须替换为国内镜像# 备份原 sources.list cp /etc/apt/sources.list /etc/apt/sources.list.backup # 替换为清华源主推稳定性高 cat /etc/apt/sources.list EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse EOF # 更新并测试 apt clean apt update apt upgrade -y # 若清华源不稳定偶发 503可切换至阿里云源备用 # sed -i s/mirrors.tuna.tsinghua.edu.cn/mirrors.aliyun.com/g /etc/apt/sources.list参数说明focal是 Ubuntu 20.04 的代号不可写成20.04或latest。universe仓库必须启用否则docker-ce等包无法安装。5.3 持久化 WSL2 配置让docker、git config、ssh keys跨重启不丢失WSL2 默认将/home目录挂载在虚拟磁盘上但/etc和/var是临时文件系统重启后docker.service配置、git config --global、ssh-agent状态会丢失。解决方案是Docker 配置持久化/etc/docker/daemon.json和/etc/systemd/system/docker.service已在etc下只要不格式化 WSL2 实例即永久存在Git 全局配置在/home/youruser/.gitconfig中设置该路径位于 WSL2 的 ext4 文件系统天然持久SSH 密钥自动加载编辑/etc/wsl.conf添加[boot] commandservice ssh start并在~/.bashrc中添加if [ -z $SSH_AUTH_SOCK ]; then eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa 2/dev/null fi血泪经验不要把项目代码放在/mnt/c/Users/xxxWindows NTFS 挂载点那里不支持 Linux 文件权限和符号链接docker build会报Permission denied。所有开发工作务必在/home/xxx或/opt/project下进行。最后说一句这套组合我用了三年从 Ubuntu 20.04 到 22.04从 Docker 20.x 到 24.x唯一不变的是——WSL2 的本质不是“Linux 子系统”而是 Windows 内核上跑的一个轻量级 Linux VM它天生适合做容器宿主而不是桌面环境。所以别折腾桌面 GUI、别装 GNOME、别试图把 WSL2 当成完整 Ubuntu 用。把它当成一个永远在线、永不蓝屏、随时docker exec -it进去 debug 的专用服务器你就赢了。希望帮到你。本文还有配套的精品资源点击获取
返回列表