WSL1升级到WSL2参考:WSL1升级到WSL2注意事项-CSDN博客
1. 更新系统包
首先,确保系统包是最新的:
bash
sudo apt update
sudo apt upgrade -y
sudo apt upgrade -y
是 Ubuntu/Debian Linux 系统中的一条命令,用于升级所有已安装的软件包 。-y的
作用:自动回答 "yes"(是),跳过确认提示。
默认情况下,apt upgrade
会列出要升级的软件包,并询问你是否确认升级(显示 Do you want to continue? [Y/n]
),加上 -y
后,系统会自动同意,适合脚本或无人值守操作。
2. 安装依赖包
bash
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
3. 添加 Docker 官方 GPG 密钥
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
GPG 密钥(GNU Privacy Guard key)是一种用于验证软件包真实性和完整性的加密密钥,属于公钥基础设施(PKI)的一部分。它的核心作用是确保你下载的 Docker 软件包或仓库元数据确实来自 Docker 官方,而非被篡改或伪造的版本。
Docker 使用 GPG 密钥对其发布的软件包(如 .deb
、.rpm
文件)或仓库元数据(如 InRelease
文件)进行数字签名。系统在安装前会通过公钥验证签名,确认文件未被第三方篡改。
在通过 HTTPS 下载软件时,GPG 密钥提供了额外的安全层。即使网络传输被拦截,攻击者也无法伪造有效的签名。
如果软件包在传输或存储过程中损坏,签名验证会失败,提示用户文件不完整。
在 Linux 系统中,并非所有软件都强制使用 GPG 密钥验证,但其使用广泛程度取决于软件的分发方式、仓库维护者的策略以及用户的安全意识。以下是不同场景下的具体情况:
官方主流发行版的软件仓库(强制验证)
-
Debian/Ubuntu (APT) 、RHEL/CentOS (YUM/DNF) 、Fedora 、openSUSE 等主流发行版的官方仓库会对其所有软件包进行 GPG 签名 。包管理器(如
apt
、dnf
、zypper
)默认要求验证签名,否则会拒绝安装。-
例如:在 Debian 中运行
apt update
时,会下载InRelease
或Release.gpg
文件,用发行版官方的 GPG 密钥验证仓库元数据的真实性。 -
如果签名验证失败 ,你会看到类似
NO_PUBKEY
或BADSIG
的错误。
-
第三方仓库(通常需要验证,但依赖维护者)
- Docker、Kubernetes、NodeSource 等 第三方提供的仓库通常也会发布 GPG 密钥,但需要用户手动导入(如 Docker 的
docker-archive-keyring.gpg
)。
直接下载的二进制或脚本(依赖开发者)
源码编译安装(通常无自动验证)
4. 添加 Docker APT 仓库
bash
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 更新 APT 包索引
bash
sudo apt update
6. 安装 Docker CE
bash
sudo apt install -y docker-ce docker-ce-cli containerd.io
7. 启动 Docker 服务(WSL 特殊处理)
默认情况下 WSL2 不支持 systemd
,但可以手动安装配置:
bash
sudo apt update && sudo apt install -y dbus-user daemonize
echo -e "#!/bin/sh\nexec /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target" | sudo tee /usr/sbin/start-systemd
sudo chmod +x /usr/sbin/start-systemd
echo -e "[boot]\ncommand = /usr/sbin/start-systemd" | sudo tee -a /etc/wsl.conf
关闭 WSL2 终端后重启(wsl --shutdown
),然后启动 Docker:
bash
sudo systemctl start docker
输出示例(如果正常运行):
bash
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-04-09 10:00:00 CST; 1min ago
Docs: https://docs.docker.com
Main PID: 1234 (dockerd)
Tasks: 8
Memory: 50.0M
CGroup: /system.slice/docker.service
└─1234 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
在 WSL2 的 Ubuntu 中,当你运行 sudo systemctl status docker
后,命令会持续输出 Docker 服务的实时状态日志,并占用当前终端 (类似"实时监控"模式),导致你无法直接输入其他命令。这是正常行为,因为 status
命令默认会保持活跃状态(除非服务已停止)。
如何退出状态查看并恢复终端?
-
按
Ctrl+C
直接中断当前状态输出,即可返回终端输入模式。
-
如果想后台运行并释放终端
加上
--no-pager
参数禁止分页输出:
bash
sudo systemctl status docker --no-pager
其他常见场景
只想查看一次状态(不持续占用终端)
bash
sudo systemctl status docker --no-pager
# 或
sudo service docker status # 传统 sysvinit 命令
想持续监控日志但保留终端输入
新开一个终端窗口(WSL2 支持多标签),或在原终端使用 &
后台运行:
bash
sudo journalctl -u docker.service -f &
(-f
表示实时跟踪日志,&
表示后台运行)