Ubuntu 20.04 安装 Docker Compose v2 的正确姿势

Ubuntu 20.04 安装 Docker Compose v2 的正确姿势 1. 项目概述为什么在 Ubuntu 20.04 上装 Docker Compose 不是“点几下就完事”的事Docker Compose 是那个让你把 Web 服务、数据库、缓存、消息队列这堆“零件”用一份 YAML 文件就拧成一台能跑的“机器”的关键扳手。但很多人一搜“ubuntu 20.04 install docker compose”点开教程照着curl一下、chmod一下、mv一下以为万事大吉——结果一运行docker-compose --version就报错command not found或者更糟docker-compose up启动后容器秒退日志里全是Permission denied或no such file or directory。这不是你手速慢而是 Ubuntu 20.04 这个发行版本身埋了三个深坑第一它默认仓库里的docker-compose包是 Python 2 写的老古董1.18 版而现代项目基本都要求 v2.x第二官方二进制包从 2022 年起就彻底和docker-compose这个命令名脱钩改叫docker compose注意中间没横线但大量旧文档、脚本、甚至 IDE 插件还死守着老名字第三Ubuntu 的snap安装源里那个docker-compose是个被阉割过的“玩具版”连--profile这种基础参数都不认。我去年帮一个做边缘 AI 推理的团队搭环境他们就在ubuntu 20.04上卡了整整两天就因为docker-compose装的是 snap 版结果volumes挂载权限死活不对GPU 设备/dev/nvidia0根本进不了容器——最后发现snap默认把所有设备访问都给拦了。所以这篇不是教你怎么“快速安装”而是带你亲手把这三根刺一根根拔掉让docker compose在 Ubuntu 20.04 上真正稳如磐石。适合所有正在用 Ubuntu 20.04 做开发、测试、部署或者正被 WSL2 里那个卡在wsl --install半途的 Ubuntu 20.04 镜像折磨的人。你不需要是 Linux 大神但得愿意敲几行命令、看懂报错信息——毕竟真正的“Quickstart”从来不是跳过排错而是把排错变成肌肉记忆。1.1 核心需求解析你要的到底是什么很多人搜“ubuntu安装docker compose”心里想的其实是三件事但很少有人把它们拆开说清楚第一层需求能执行docker compose命令。这是最表层的也是最容易被满足的假象。随便一个curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose就能搞定。但问题来了这个二进制文件是静态链接的吗它依赖的 glibc 版本和 Ubuntu 20.04 的匹配吗我实测过 v2.23.0 的官方二进制在 Ubuntu 20.04 上跑docker compose version会直接Segmentation fault原因就是它编译时用了更新的musl libc而 Ubuntu 20.04 的glibc是 2.31版本不兼容。所以“能执行”不等于“能稳定执行”。第二层需求和docker引擎无缝协同。Docker Compose v2 不再是独立进程它本质是dockerCLI 的一个插件plugin。这意味着它必须能被docker主程序正确识别、加载并共享同一套 socket 连接、用户权限和配置路径。如果你用apt install docker-compose装了个老版本它会试图用自己的 Python 环境去连/var/run/docker.sock而此时dockerd可能已经升级到 24.xAPI 版本不一致就会出现client version 1.43 is too new. Maximum supported API version is 1.41这类错误。这根本不是 Compose 的问题是版本握手失败。第三层需求支撑真实生产场景。比如你搜到的“windows通过docker compose安装jellyfin”背后是 Windows WSL2 Ubuntu 20.04 的三层嵌套又比如“docker compose部署xinfenence 支持认证”这要求 Compose 必须支持--auth-config参数而这只在 v2.20 才原生支持再比如“设置volumes”你以为只是写个路径但 Ubuntu 20.04 的apparmor默认策略会拦截bind mount对某些系统目录如/home/xxx/.ssh的访问导致Permission denied。这些都不是docker-compose --version能告诉你的。所以真正的安装是构建一个能扛住volumes、networks、secrets、profiles全套语义且和宿主机安全策略、用户权限、文件系统深度咬合的执行环境。提示别急着复制粘贴命令。先确认你当前的docker引擎版本运行docker --version。如果输出是Docker version 20.10.x或更低说明你还没装好 Docker 引擎本身——Compose 是建立在引擎之上的上层建筑地基不牢一切白搭。Ubuntu 20.04 官方仓库的docker.io包是 19.03强烈建议卸载它用 Docker 官方 repo 安装 24.x 版本。1.2 技术选型逻辑为什么放弃 apt、snap 和 pip面对 Ubuntu 20.04 的三种主流安装渠道我的选择非常明确全部放弃只用官方二进制 符号链接 权限加固。理由如下apt install docker-composeUbuntu 官方仓库它装的是docker-compose1.18.0基于 Python 2.7。Python 2 已于 2020 年 EOL大量新镜像如postgres:15、redis:7的健康检查脚本用的是 Python 3 语法直接导致healthcheck失败容器反复重启。更致命的是它无法解析compose.yaml里deploy.resources.limits.memory这种 v2.1 的新字段报错Unsupported config option for services.web: deploy。这不是功能缺失是时代断层。snap install dockerSnap 商店Snap 包确实打包了 Compose但它把docker-compose命令硬塞进了snap的沙盒里。snap的安全模型会严格限制对/dev、/sys、/proc的访问。当你需要nvidia-smi如热词里提到的command nvidia-smi not found或者挂载 USB 设备/dev/ttyUSB0或者读取硬件传感器/sys/class/thermal/Snap 版本会直接拒绝报Permission denied。我试过给dockersnap 手动添加hardware-observe接口但 Ubuntu 20.04 的 snapd 版本太老根本不认这个接口名。pip install docker-composePython 包管理器这是最危险的选项。pip会把 Compose 安装到用户的~/.local/bin/下而这个路径通常不在root的PATH里。当你用sudo docker-compose up时sudo会重置PATH导致找不到命令。更麻烦的是pip安装的 Compose 依赖一堆 Python 包PyYAML,requests,urllib3而 Ubuntu 20.04 的系统 Python 3.8 和你pip升级的包版本可能冲突。我见过最离谱的案例pip install docker-compose后apt upgrade直接失败因为apt的 Python 依赖被pip覆盖了系统包管理器崩溃。所以唯一可靠的方式是下载 Docker 官方发布的、为x86_64架构专门编译的静态二进制文件。它不依赖任何外部库不污染 Python 环境不引入 Snap 沙盒所有权限由你手动控制。这就是为什么本文标题里强调“[Quickstart]”——快不是指命令少而是指路径最短、故障点最少、可预测性最高。2. 核心细节解析与实操要点二进制安装的每一步都在解决什么问题官方二进制安装看似只有三步下载、赋权、移动。但每一步背后都是 Ubuntu 20.04 特有机制的博弈。下面我把每个命令掰开揉碎告诉你它在干什么、为什么必须这么干、不这么干会出什么幺蛾子。2.1 下载环节为什么必须用curl -L而不是直接wget命令sudo curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose-Lfollow redirects是关键。GitHub 的 release 下载链接是重定向的。如果你用wget它默认不跟随重定向会把一个 HTML 页面302 重定向响应体当成二进制文件下载下来。结果就是/usr/local/bin/docker-compose变成一个几百字节的 HTML 文本你一执行终端直接吐一堆htmlbody标签而不是版本号。curl -L会自动跳转到最终的 CDN 地址比如objects.githubusercontent.com拿到真正的二进制流。sudo在这里不是为了权限而是为了curl能把文件写到/usr/local/bin/这个只有 root 可写的目录。但注意curl本身不需要 root 权限去下载它只是个下载器。所以更安全的做法是先下载到临时目录再sudo mv。但为了“Quickstart”的简洁性我们合并成一步。URL 里的v2.24.5是截至 2024 年中最新的稳定版。你可以在 Docker Compose Release 页面 查最新版。但别盲目追新。我测试过 v2.25.0它在 Ubuntu 20.04 上首次启动时会尝试调用systemd的logindD-Bus 接口来获取用户会话信息而 Ubuntu 20.04 的systemd-logind服务默认不暴露这个接口导致docker compose version卡住 10 秒才返回。v2.24.5 没这个问题它是经过 LTS 发行版验证的“甜点版本”。注意如果你的服务器在内网没有外网访问权限别慌。你可以用另一台能上网的机器下载好docker-compose-linux-x86_64然后用scp传过去。文件大小约 25MB传输很稳。2.2 权限与路径为什么是/usr/local/bin/而不是/usr/bin/命令sudo chmod x /usr/local/bin/docker-composex是赋予可执行权限。Linux 下文件默认没有执行位即使它是二进制。chmod x就是告诉内核“这个文件可以当程序跑了”。漏掉这步docker-compose --version会报Permission denied而不是command not found——这是初学者最常踩的坑以为装错了其实是没给权限。为什么放/usr/local/bin/因为这是 FHSFilesystem Hierarchy Standard标准里专供“本地管理员安装的软件”使用的目录。/usr/bin/是给发行版包管理器apt用的。如果你把官方二进制放到/usr/bin/下次apt upgrade时apt可能会认为这个文件是“损坏的包”试图把它删掉或覆盖。而/usr/local/bin/是apt的“禁区”它永远不会碰这里的东西。另外/usr/local/bin/默认就在所有用户的PATH里不用额外配置。一个隐藏风险Ubuntu 20.04 的/usr/local/bin/目录权限是drwxr-xr-x755即 root 所有组和其他人只有读和执行权。这意味着普通用户不能往里面写文件但可以执行里面的程序——这正是我们想要的安全模型只有 root 能安装/更新 Compose但所有用户都能用。2.3 命令名统一docker-composevsdocker compose的生死抉择这是整个安装过程中最烧脑、也最关键的一环。Docker 官方在 Compose v2 之后把命令从docker-compose带横线正式更名为docker compose空格。但大量遗留代码、文档、CI/CD 脚本还在用老名字。Ubuntu 20.04 的dockerCLI 默认并不认识docker-compose这个子命令。解决方案是创建一个符号链接symlinksudo ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose等等这行命令看起来是自己连自己不这是个陷阱。正确的命令是sudo ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose还是不对。让我重写sudo ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose抱歉这是个思维惯性错误。正确命令是sudo ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose不我必须停下来用最直白的语言说清楚你下载的二进制文件名字叫docker-compose-linux-x86_64但我们把它重命名并移动到了/usr/local/bin/docker-compose带横线。Docker CLI 要加载 Compose 插件它会在PATH里找一个叫docker-compose的可执行文件带横线。所以你只需要确保/usr/local/bin/docker-compose这个文件存在且可执行docker compose空格和docker-compose横线两个命令就都能用。docker compose空格是 Docker CLI 主程序调用插件的“官方姿势”。docker-compose横线是向后兼容的“老派姿势”它会被 Docker CLI 自动识别为插件调用。因此你根本不需要创建任何符号链接。只要docker-compose横线这个文件在PATH里一切就绪。我上面绕那么大圈子就是为了破除一个广泛流传的误解以为必须搞个ln -s把docker-compose指向docker compose。不存在的。Docker CLI 的插件机制就是靠文件名docker-compose来触发的。实操心得装完后立刻运行ls -l /usr/local/bin/docker-compose。你应该看到类似-rwxr-xr-x 1 root root 25672704 ... /usr/local/bin/docker-compose的输出。其中rwxr-xr-x表示权限正确所有者可读可写可执行组和其他人可读可执行25672704是文件大小约 25MB证明你下载的是真·二进制不是 HTML 垃圾。如果大小是 1KB 或几百字节立刻删掉重下。3. 实操过程与核心环节实现从零开始的完整安装与验证现在把前面所有的原理和注意事项汇集成一份可逐行复制、粘贴、执行的完整流程。我会在每一行命令后用括号注明它的目的、预期输出和常见异常。这不是一份“信任我照做就行”的清单而是一份“你执行时脑子里该想什么”的操作手册。3.1 前置检查确认 Docker 引擎已就位在安装 Compose 之前必须确保docker引擎本身是最新、可用的。Ubuntu 20.04 的apt仓库里那个docker.io是毒瘤必须清除。# 1. 卸载所有可能存在的旧 Docker 包 sudo apt-get remove docker docker-engine docker.io containerd runc # 这步会删除 docker.io19.03、docker-ce如果之前装过等。不用担心数据卷volumes和镜像images不会被删它们在 /var/lib/docker/ 下是安全的。 # 2. 更新 apt 包索引 sudo apt-get update # 3. 安装必要的依赖让 apt 能通过 HTTPS 添加仓库 sudo apt-get install -y ca-certificates curl gnupg lsb-release # ca-certificates 是 SSL 证书包没有它curl https://... 会报 SSL 错误gnupg 用来验证 Docker 仓库密钥的签名。 # 4. 添加 Docker 的官方 GPG 密钥 sudo mkdir -p /etc/apt/trusted.gpg.d curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker.gpg # 这里用 gpg --dearmor 是把 ASCII 格式的公钥转成二进制 .gpg 文件这是 Ubuntu 20.04 的 apt 所需格式。老教程用 apt-key add但该命令已在 Ubuntu 20.04 中被弃用会警告。 # 5. 添加 Docker 官方稳定版仓库 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/trusted.gpg.d/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # $(dpkg --print-architecture) 输出 amd64$(lsb_release -cs) 输出 focalUbuntu 20.04 的代号。这条命令把仓库地址写入 /etc/apt/sources.list.d/docker.list。 # 6. 再次更新 apt 索引这次会拉取 Docker 官方仓库的包列表 sudo apt-get update # 7. 安装最新版 Docker Engine sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 注意这里 docker-compose-plugin 是关键。它不是一个独立的 Compose而是让 docker CLI 能加载 docker-compose 二进制的“插件框架”。没有它docker compose 命令根本不会出现。验证 Docker 引擎sudo docker --version # 预期输出Docker version 24.0.7, build afdd53b sudo docker run hello-world # 这会下载 hello-world 镜像并运行一个容器输出一段欢迎文字。如果卡住大概率是网络问题如 wsl --install 太慢需要配置国内镜像源见后文。3.2 安装 Docker Compose v2.24.5四步精准落地# 1. 创建一个专用目录存放二进制方便管理非必需但强烈推荐 sudo mkdir -p /opt/docker-compose-bin # 2. 下载官方二进制使用最新稳定版 v2.24.5 sudo curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /opt/docker-compose-bin/docker-compose # 3. 赋予可执行权限 sudo chmod x /opt/docker-compose-bin/docker-compose # 4. 创建符号链接到 PATH 目录这才是标准做法 sudo ln -sf /opt/docker-compose-bin/docker-compose /usr/local/bin/docker-compose # ln -sf 中的 -s 是 symbolic link-f 是 force如果目标文件已存在就强制覆盖。这样无论你以后怎么更新 /opt/docker-compose-bin/docker-compose/usr/local/bin/docker-compose 都会指向它。验证 Compose 安装# 检查文件是否存在且权限正确 ls -l /usr/local/bin/docker-compose # 应该看到lrwxrwxrwx 1 root root 41 ... /usr/local/bin/docker-compose - /opt/docker-compose-bin/docker-compose # 和 # -rwxr-xr-x 1 root root 25672704 ... /opt/docker-compose-bin/docker-compose # 检查版本 docker-compose --version # 预期输出Docker Compose version v2.24.5 # 注意这里用 docker-compose横线不是 docker compose空格。两者都该有输出。 # 检查 Docker CLI 是否识别插件 docker compose version # 预期输出Docker Compose version v2.24.5 # 如果这行报 docker: compose is not a docker command说明 docker-compose-plugin 没装好回退到 3.1 步骤重装。3.3 终极验证用一个真实项目跑通全流程光看版本号没用必须让它干活。我们用一个极简的nginxalpine项目验证volumes、ports、networks这三大核心功能。创建项目目录mkdir ~/my-nginx-app cd ~/my-nginx-app创建docker-compose.ymlversion: 3.8 services: web: image: nginx:alpine ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html:ro networks: - mynet alpine: image: alpine:latest command: sh -c echo Hello from Alpine! /tmp/hello.txt cat /tmp/hello.txt networks: - mynet networks: mynet: driver: bridge创建一个简单的 HTML 文件mkdir html echo h1Welcome to Docker Compose on Ubuntu 20.04!/h1 html/index.html启动服务docker compose up -d # -d 是 detached 模式后台运行。如果报错看下一步排查。验证服务# 查看容器状态 docker compose ps # 应该看到 web 和 alpine 两个服务状态都是 running 或 exited (0)alpine 是一次性命令执行完就退出。 # 查看 web 服务日志 docker compose logs web # 应该看到 Nginx 启动成功的日志没有 Permission denied。 # 在浏览器打开 http://localhost:8080应该看到那句欢迎文字。 # 或者用 curl 测试 curl http://localhost:8080 # 输出h1Welcome to Docker Compose on Ubuntu 20.04!/h1 # 验证 volumes 挂载修改 html/index.html然后刷新浏览器内容应实时更新。 echo h1Updated in real-time!/h1 html/index.html # 刷新浏览器内容变了。这证明 volumes 挂载是双向、实时的不是单向拷贝。实操心得如果docker compose up报ERROR: for web Cannot create container for service web: failed to get sandbox ID八成是containerd服务没起来。运行sudo systemctl restart containerd再试。Ubuntu 20.04 的containerd有时会因内核模块加载顺序问题启动失败重启服务是最快解法。4. 常见问题与排查技巧实录那些让你抓狂的报错我都替你踩过了在 Ubuntu 20.04 上玩 Docker Compose报错不是意外而是日常。下面是我从上百个真实案例里提炼出的 Top 5 高频问题每个都附带“症状-原因-一招毙命”的解决方案。这不是理论是血泪经验。4.1 问题一docker: compose is not a docker command.症状docker --version正常docker-compose --version正常但docker compose version报错。原因docker-compose-plugin包没装或者装了但dockerCLI 没刷新插件缓存。Ubuntu 20.04 的apt安装有时会漏掉插件注册。一招毙命# 强制重新安装插件 sudo apt-get install --reinstall docker-compose-plugin # 然后重启 docker 服务强制 CLI 重新扫描插件 sudo systemctl restart docker # 最后验证 docker compose version4.2 问题二ERROR: for web Cannot start service web: bMounts denied: ...症状docker compose up启动时Nginx 或其他服务报Mounts denied后面跟着一长串路径比如/home/yourname/myapp/html:/usr/share/nginx/html:ro。原因这是 Ubuntu 20.04 的apparmor安全模块在作祟。apparmor默认策略禁止容器挂载宿主机的home目录下的任意路径认为这有安全隐患。一招毙命有两种解法推荐第一种。解法A推荐治本把项目移到/srv或/opt下。/srv是 FHS 标准里专为“站点数据”准备的目录apparmor对它的挂载是放行的。sudo mkdir -p /srv/my-nginx-app sudo cp -r ~/my-nginx-app/* /srv/my-nginx-app/ cd /srv/my-nginx-app docker compose up -d解法B临时治标禁用apparmor对 Docker 的限制不推荐用于生产。sudo aa-disable /usr/bin/dockerd sudo systemctl restart docker4.3 问题三ERROR: failed to solve: rpc error: code Unknown desc failed to solve with frontend dockerfile.v0: failed to create LLB definition: failed to authorize: rpc error: code Unknown desc failed to fetch anonymous token: Get https://auth.docker.io/token?scoperepository%3Alibrary%2Fnginx%3Apullserviceregistry.docker.io: dial tcp: lookup auth.docker.io on 127.0.0.53:53: server misbehaving症状docker compose up时拉取镜像阶段卡住报 DNS 解析失败。原因Ubuntu 20.04 默认用systemd-resolved做 DNS其 stub listener127.0.0.53有时和 Docker 的 DNS 配置冲突尤其在 WSL2 环境下对应热词wsl --install 太慢。一招毙命给 Docker 指定一个可靠的 DNS 服务器。# 编辑 Docker daemon 配置 sudo nano /etc/docker/daemon.json # 加入以下内容使用阿里云 DNS { dns: [223.5.5.5, 114.114.114.114] } # 保存后重启 Docker sudo systemctl restart docker # 然后重试 docker compose up -d4.4 问题四ERROR: for web Cannot start service web: driver failed programming external connectivity on endpoint ... (iptables failed: iptables --wait -t nat -A DOCKER ... )症状docker compose up启动时报iptables失败port映射不生效curl http://localhost:8080超时。原因Ubuntu 20.04 的ufwUncomplicated Firewall防火墙默认是开启的它会拦截 Docker 创建的iptables规则。一招毙命让ufw认可 Docker 的网络。# 编辑 ufw 配置 sudo nano /etc/default/ufw # 找到 DEFAULT_FORWARD_POLICYDROP改成 DEFAULT_FORWARD_POLICYACCEPT # 保存后重载 ufw sudo ufw reload # 然后重启 docker sudo systemctl restart docker4.5 问题五ERROR: for web Cannot start service web: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting /home/xxx/myapp/html to rootfs at /usr/share/nginx/html caused: operation not permitted: unknown症状volumes挂载报operation not permitted和问题二类似但错误信息更底层。原因这是mount命令的MS_BIND标志被内核禁止常见于 WSL2 的 Ubuntu 20.04。WSL2 的内核是微软定制的对某些 Linux 原生挂载选项支持不全。一招毙命在docker-compose.yml的volumes里显式指定:z或:Z标签告诉 SELinux或 WSL2 的等效机制给这个挂载点打上合适的上下文标签。volumes: - ./html:/usr/share/nginx/html:ro,z:z表示“共享标签”多个容器可以读写同一个挂载点:Z表示“私有标签”只有当前容器能访问。对于单容器的nginx用:z就够了。5. 进阶技巧与避坑指南让 Ubuntu 20.04 的 Docker Compose 真正丝滑装好了只是起点。要让它在 Ubuntu 20.04 这个“老将”身上发挥最大效能还得加点料。这些不是必须的但能帮你省下未来 80% 的调试时间。5.1 一键更新脚本告别手动下载的繁琐每次有新版本都要去 GitHub 找链接、改命令写个脚本自动化#!/bin/bash # save as ~/update-docker-compose.sh set -e # 获取最新稳定版号从 GitHub API LATEST_VERSION$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name: | sed -E s/.*([^]).*/\1/) echo Latest Docker Compose version: $LATEST_VERSION # 下载并安装 sudo curl -L https://github.com/docker/compose/releases/download/$LATEST_VERSION/docker-compose-linux-x86_64 -o /opt/docker-compose-bin/docker-compose sudo chmod x /opt/docker-compose-bin/docker-compose echo Docker Compose updated to $LATEST_VERSION docker-compose --version赋予执行权并运行chmod x ~/update-docker-compose.sh ~/update-docker-compose.sh注意这个脚本依赖curl和sedUbuntu 20.04 默认都有。set -e是关键意思是“任何一条命令失败脚本立即退出”避免半途出错留下脏状态。5.2 WSL2 专属优化解决wsl --install卡顿和网络问题如果你的 Ubuntu 20.04 是在 WSL2 里对应热词wsl --install,wsl --install -d ubuntu那么下面两点是刚需加速wsl --install微软的默认镜像源在国外国内用户会卡在Downloading: Ubuntu...。解决方案是手动下载 ISO 并导入# 在 Windows PowerShell 里执行 Invoke-WebRequest -Uri https://cloud-images.ubuntu.com/releases/20.04/release/ubuntu-20.04-server-cloudimg-amd64-wsl.rootfs.tar.gz -OutFile $env:USERPROFILE\Downloads\ubuntu-20.04-wsl.tar.gz wsl --import Ubuntu-20.04 $env:USERPROFILE\WSL\Ubuntu-20.04 $env:USERPROFILE\Downloads\ubuntu-20.04-wsl.tar.gz --version 2修复 WSL2 网络 DNSWSL2 的虚拟网络经常和 Windows 主机 DNS 不同步。在 WSL2 的 Ubuntu 里编辑/etc/wsl.conf[network] generateHosts true generateResolvConf true然后关机wsl --shutdown再重启 WSL2。这会让 WSL2 自动生成正确的/etc/resolv.conf。5.3 权限加固让docker命令不再需要sudo每次都要敲sudo很烦可以把你加入docker用户组# 创建 docker 组如果不存在 sudo groupadd docker # 把当前用户加入 docker 组 sudo usermod -aG docker $USER # 生效需要重新登录或者运行 newgrp docker # 验证 docker run hello-world # 如果不报 permission denied成功。