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

相关推荐
dadaobusi几秒前
MRIF说明
linux
我星期八休息10 分钟前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表
一个在高校打杂的35 分钟前
honeypot之opencanary(轻量化蜜罐)
linux·网络安全·网络攻击模型·安全威胁分析·策略模式
s_w.h41 分钟前
【 linux 】认识make和makefile
linux·运维·bash
代码熬夜敲Q1 小时前
Docker基础
运维·docker·容器
亚空间仓鼠1 小时前
Docker容器化高可用架构部署方案(十四)
docker·容器·架构
不怕犯错,就怕不做1 小时前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
Harm灬小海1 小时前
【云计算学习之路】学习Centos7系统-Linux软件包管理
linux·运维·服务器·学习·云计算·yum·rpm
caicai_xiaobai1 小时前
Ubuntu上Git安装步骤
linux·git·ubuntu
平行云1 小时前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送