在 WSL2的 Ubuntu 20.04 中安装 Docker

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)FedoraopenSUSE 等主流发行版的官方仓库会对其所有软件包进行 GPG 签名 。包管理器(如 aptdnfzypper)默认要求验证签名,否则会拒绝安装。

    • 例如:在 Debian 中运行 apt update 时,会下载 InReleaseRelease.gpg 文件,用发行版官方的 GPG 密钥验证仓库元数据的真实性。

    • 如果签名验证失败 ,你会看到类似 NO_PUBKEYBADSIG 的错误。

第三方仓库(通常需要验证,但依赖维护者)

  • 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 表示实时跟踪日志,& 表示后台运行)

相关推荐
筱戥芊茹9 分钟前
RK3588上Linux系统编译C/C++ Demo时出现BUG:The C/CXX compiler identification is unknown
linux·c语言·c++·嵌入式硬件·bug
__基本操作__16 分钟前
linux以C方式和内核交互监听键盘[香橙派搞机日记]
linux·c语言·输入子系统
邹卓为41 分钟前
ubuntu 系统安装Mysql
mysql·ubuntu·adb
reddingtons2 小时前
在 Ubuntu 下通过 Docker 部署 Caddy 服务器
服务器·ubuntu·docker
hope_wisdom2 小时前
Linux系统编程之虚拟内存
linux·虚拟内存·linux编程·缺页中断
CIAS2 小时前
Linux vagrant 导入Centos到virtualbox
linux·vagrant·virtualbox
coder_lorraine3 小时前
【Docker系列】Docker简介:轻松理解容器技术
docker·容器
小鱼啊小鱼3 小时前
【Linux】基于Exynos4412的U-Boot引导程序移植
linux
编程就是如此3 小时前
CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤
linux·centos
normaling3 小时前
十,软件包管理
linux