Tao
Tao

基于Cinnamon 的 Linux 系统上安装和配置Docker引擎的使用指南

为了方便安装过程,下表将常见的基于 Cinnamon 的发行版映射到设置官方 Docker apt 存储库所需的关键标识符。VERSION_CODENAME 对于 Linux Mint 用户尤为关键,他们必须使用其底层 Ubuntu 基础的代号。

发行版 示例版本 基础操作系统 基础版本 所需的 VERSION_CODENAME
Linux Mint 22 “Wilma” Ubuntu 24.04 LTS noble
Linux Mint 21.3 “Virginia” Ubuntu 22.04 LTS jammy
Ubuntu Cinnamon 24.04 LTS Ubuntu 24.04 LTS noble
Debian GNU/Linux 12 “Bookworm” Debian 12 bookworm
LMDE (Linux Mint Debian Edition) 6 “Faye” Debian 12 bookworm

安装docker前的系统的基本步骤,包括更新软件包、安装必要工具以及移除任何可能冲突的软件。

在安装新软件之前,一个至关重要的步骤是同步本地软件包索引与中央存储库,并将所有已安装的软件包升级到最新版本。这能确保所有系统依赖项都是最新的,并有助于防止潜在的冲突。

通过命令完成:

bash

sudo apt update && sudo apt upgrade -y

接下来安装ca-certificates

bash

sudo apt install ca-certificates curl

Linux发行版有时会在其默认存储库中提供自己的非官方Docker 软件包(例如 docker.io)。这些软件包可能已过时或配置与官方 Docker版本不同,并可能在安装或更新过程中引起冲突。为确保从官方来源进行干净的安装,必须首先移除任何这些冲突的软件包。

需要卸载的软件包包括 docker.io、docker-doc、docker-compose 和 podman-docker,以及旧的 Docker 组件如 containerd 和 runc(如果它们是独立安装的)。官方 Docker 文档提供了一个强大的命令,试图移除所有已知的冲突软件包。即使某些或所有软件包当前未安装在系统上,运行此命令也是安全的,因为 apt-get 只会报告它们未找到。

执行以下命令进行清理:

bash

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

注意:此命令不会移除存储在 /var/lib/docker/ 目录中的任何现有镜像、容器、卷或网络。如果想要完全重新开始,需要在卸载软件包后手动删除此目录。

虽然 Docker 可以通过多种方式安装,但对于任何基于 Debian 的系统(包括 Ubuntu 和 Linux Mint),官方推荐的方法是使用 Docker 的官方 apt 存储库。

安装方法的选择对系统的长期安全性和可维护性有重大影响。选择通过其官方存储库安装 Docker 引擎是最优的方法,原因如下:

  • 生命周期管理:此方法将 Docker 集成到系统的原生软件包管理器 apt 中。这意味着 Docker 引擎的更新,包括关键的安全补丁和新功能,都通过标准的系统更新命令(如 sudo apt upgrade)进行管理。这自动化了维护过程,并确保 Docker 安装随着时间的推移保持最新和安全。

  • 信任与真实性:该存储库使用 GPG 密钥进行保护,apt 使用该密钥验证下载的每个软件包的加密签名。这保证了软件确实来自 Docker,并且未被篡改或损坏。

  • 稳定性与可靠性:相比之下,诸如便捷脚本或手动安装软件包等替代方法绕过了系统的软件包管理器。这将跟踪新版本、检查安全漏洞和执行手动升级的全部负担都放在了系统管理员身上。这种手动过程容易出错和被忽视,可能导致系统运行着过时且不安全的 Docker 版本。

基于这些原因,对于在稳定的开发、测试或生产系统上安装 Docker,使用官方 apt 存储库是唯一被专业推荐的方法。

以下步骤为设置 Docker 存储库和安装 Docker 引擎提供了一个完整的脚本。

这第一步是在本地系统和远程 Docker 存储库之间建立信任。它涉及下载 Docker 的官方 GNU Privacy Guard (GPG) 密钥,并将其存储在 apt 系统可以访问以进行软件包验证的位置。

bash

# 创建一个用于存放 APT 密钥环的目录,并设置适当的权限以确保其存在。
sudo install -m 0755 -d /etc/apt/keyrings

# 使用 curl 下载 Docker 的官方 GPG 密钥,并将其保存到新目录中。
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# 确保密钥文件具有全局可读权限,以便 apt 系统可以使用它。
sudo chmod a+r /etc/apt/keyrings/docker.asc

此步骤通过创建一个新的源列表文件,将 Docker 存储库注册到 apt 软件包管理器中。该文件告诉 apt 在哪里寻找官方的 Docker 软件包。该命令是动态构建的,以确保它适用于系统的特定架构和操作系统版本。

重要:这是最关键的一步,需要特别注意,尤其是对于 Linux Mint 用户。

对于运行 Debian、Ubuntu 或官方 Ubuntu 风味版本(如 Ubuntu Cinnamon) 的系统,可以使用以下命令。它会自动检测发行版 ID(ubuntu 或 debian)及其代号(noble、jammy、bookworm 等)。

bash

# 此命令动态构建存储库源文件。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/$(. /etc/os-release && echo "$ID") \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

对于 Linux Mint 用户,自动检测 VERSION_CODENAME 会错误地使用 Mint 的代号(例如 virginia),而不是所需的 Ubuntu 基础代号。这将导致错误。必须手动替换为 Ubuntu 基础的代号。请参考第 1.4 节中的表格以获取正确的代号。

例如,对于 Linux Mint 21.x(基于 Ubuntu 22.04 LTS “Jammy Jellyfish”):

bash

# 手动指定 'jammy' 作为 Ubuntu 基础的代号。
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  jammy stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

添加存储库后,必须再次更新本地软件包索引,以使 apt 知道新可用的 Docker 软件包。

bash

sudo apt update

最后,安装最新稳定版的 Docker 引擎及其相关组件。该命令安装了几个软件包:

  • docker-ce:Docker 社区版,即核心守护进程。
  • docker-ce-cli:命令行界面客户端。
  • containerd.io:一个独立的、行业标准的容器运行时,管理容器的生命周期。
  • docker-buildx-plugin:一个扩展,通过 BuildKit 后端启用高级构建功能。
  • docker-compose-plugin:将 Docker Compose 功能直接集成到 Docker CLI 中,允许使用 docker compose 命令。

执行安装命令:

bash

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

sh

#!/bin/bash

# ======================================================================================
#
#                            Docker Engine 安装脚本
#
#   适用于基于 Debian 的系统 (Ubuntu, Linux Mint, Debian)
#   作者: Gemini AI
#   功能:
#       1. 卸载旧的或冲突的 Docker 软件包。
#       2. 更新系统并安装必要的依赖项。
#       3. 添加 Docker 官方 GPG 密钥和 APT 仓库。
#       4. 安装最新的 Docker Engine, containerd, 和 Docker Compose。
#       5. 输出后续配置步骤的提示信息。
#
# ======================================================================================

# 使用 'set -e' 命令,确保脚本在任何命令失败时立即退出。
set -e

echo "--- [步骤 1/5] 开始 Docker 安装前的系统清理 ---"

# 卸载可能存在的旧版本 Docker 或冲突的软件包
# 使用 'sudo' 确保有足够的权限
# '|| true' 确保即使没有找到这些包,脚本也不会因为错误而停止
sudo apt-get remove -y docker docker-engine docker.io containerd runc docker-ce docker-ce-cli || true
echo "旧版本 Docker 清理完成。"
echo ""

echo "--- [步骤 2/5] 更新软件包列表并安装依赖项 ---"
# 更新 apt 包索引
sudo apt-get update

# 安装必要的软件包,以允许 apt 通过 HTTPS 使用仓库
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
echo "依赖项安装完成。"
echo ""

echo "--- [步骤 3/5] 添加 Docker 官方 GPG 密钥和仓库 ---"

# 创建用于存放 GPG 密钥的目录
sudo install -m 0755 -d /etc/apt/keyrings

# 下载 Docker 官方 GPG 密钥
# 使用 curl 下载并保存到指定目录
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg # 确保密钥文件可读

# 设置 Docker 的 APT 仓库
# 这会根据你的系统架构和发行版代号自动配置正确的仓库地址
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "Docker APT 仓库已成功添加。"
echo ""

echo "--- [步骤 4/5] 安装 Docker Engine ---"
# 再次更新 apt 包索引,以包含来自新 Docker 仓库的包
sudo apt-get update

# 安装最新版本的 Docker Engine, containerd, 和 Docker Compose
# 'docker-ce' 是 Docker Community Edition (社区版)
# 'docker-ce-cli' 是 Docker 命令行工具
# 'containerd.io' 是一个容器运行时
# 'docker-buildx-plugin' 和 'docker-compose-plugin' 是用于构建和编排的插件
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "Docker Engine 安装成功!"
echo ""

echo "--- [步骤 5/5] 输出安装后重要提示 ---"
echo ""
echo "✅ Docker 已成功安装!"
echo ""
echo "下一步重要操作:"
echo "为了避免每次使用 docker 命令都需要输入 'sudo',请执行以下命令将您的用户添加到 'docker' 组:"
echo ""
echo "   sudo usermod -aG docker \$USER"
echo ""
echo "执行上述命令后,您需要完全注销并重新登录系统,才能使组更改生效。"
echo "重新登录后,您可以通过运行以下命令来验证安装是否成功,并且无需 'sudo':"
echo ""
echo "   docker run hello-world"
echo ""
echo "======================================================================================"

为了创建一个功能齐全、安全且便捷的开发环境,需要执行几项安装后任务,涵盖验证安装、启用非 root 用户访问以及管理 Docker 服务。

第一个验证是检查 Docker 服务(守护进程)是否已正确安装并正在运行。systemctl status 命令提供了有关服务状态的详细信息。

bash

sudo systemctl status docker

输出应显示服务为 active (running)

最终的测试是运行 hello-world 容器。这个简单的命令对整个 Docker 堆栈进行全面的端到端测试。它指示 Docker CLI 联系守护进程,守护进程随后从 Docker Hub 拉取轻量级的 hello-world 镜像,从该镜像创建一个新容器,运行它,并将其输出流式传输到终端。成功执行确认所有组件都正常协同工作。

bash

sudo docker run hello-world

如果安装成功,将打印出以"Hello from Docker!“开头的确认消息。

默认情况下,安装后所有 docker 命令都必须以 sudo 为前缀。这是一项安全功能,因为 Docker 守护进程的控制套接字位于 /var/run/docker.sock,其所有者是 root 用户。尝试以普通用户身份运行 docker 命令将导致"permission denied"错误。

虽然这种默认行为是安全的,但对于开发来说很不方便,可能会干扰IDE 和工具的集成,并鼓励不必要地使用提升的权限运行命令。解决此问题的标准且安全的方法是将用户帐户添加到 docker 组,该组在安装过程中会自动创建。该组的成员被授予访问 Docker 套接字的权限。对于任何开发人员来说,此步骤应被视为设置过程的重要组成部分。

  1. 将当前用户添加到 docker 组${USER} 环境变量会自动解析为当前登录的用户名。

bash

sudo usermod -aG docker ${USER}
  1. 应用新的组成员身份。组成员身份的更改在当前终端会话中不会生效。用户必须注销并重新登录,或使用 newgrp 命令启动一个具有更新后组权限的新 shell。

bash

newgrp docker
  1. 验证非 root 访问权限。应用组更改后,测试 docker 命令是否可以在没有 sudo 的情况下运行。

bash

docker run hello-world

现在这应该能成功执行,确认用户拥有必要的权限。

在像 Debian 和 Ubuntu 这样的现代 Linux 发行版上,systemd 初始化系统负责管理后台服务(守护进程)。systemctl 命令是与 systemd 交互以控制这些服务的主要工具。在 Debian 及其衍生版上,Docker 服务被自动配置为在系统启动时启动。以下命令对于管理 Docker 守护进程的生命周期至关重要。

此表为管理 Docker 服务最常用的 systemctl 命令提供了快速参考。

命令 功能
sudo systemctl status docker 检查 Docker 服务的当前运行状态,显示其是否活动、非活动或失败,并附带最近的日志条目。
sudo systemctl start docker 如果 Docker 服务当前已停止,则启动它。
sudo systemctl stop docker 停止 Docker 服务。除非守护进程另有配置,否则活动容器将继续运行。
sudo systemctl restart docker 停止然后立即启动服务。这对于应用对守护进程所做的配置更改很有用。
sudo systemctl enable docker 配置服务在每次系统启动时自动启动。这是 Debian/Ubuntu 上的默认行为。
sudo systemctl disable docker 阻止服务在系统启动时自动启动。服务仍然可以手动启动。

虽然强烈推荐使用官方存储库方法,但 Docker 也为特定场景提供了替代安装方法。了解这些替代方案、它们的预期用途以及它们的显著缺点是很有价值的。

Docker 提供了一个自动化安装过程的实用脚本。它可以通过一个管道命令下载并执行。

bash

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

使用场景:此脚本专为快速测试和开发环境设计,其主要目标是以最少的用户交互尽快让 Docker 运行起来。

警告:官方文档明确建议不要在生产环境中使用便捷脚本。该脚本对系统做出假设,并以 root 权限运行,而没有给用户机会审查它将执行的操作。最重要的是,它绕过了系统的软件包管理器,这意味着它不会创建存储库源文件。因此,Docker 安装不会随标准系统更新而更新,所有未来的升级都需要手动干预。

此方法涉及手动导航到 Docker 软件包存储库(download.docker.com),下载每个组件(containerd.io、docker-ce-cli、docker-ce 等)的独立 .deb 软件包文件,然后使用 dpkg 命令安装它们。

bash

# 下载必要的.deb文件后的示例命令
sudo dpkg -i ./containerd.io_<version>_<arch>.deb \
./docker-ce-cli_<version>_<arch>.deb \
./docker-ce_<version>_<arch>.deb \
./docker-buildx-plugin_<version>_<arch>.deb \
./docker-compose-plugin_<version>_<arch>.deb

使用场景:此方法的主要且合法的使用场景是在气隙系统(即没有任何直接或间接互联网访问的计算机)上安装 Docker。它也可以用于安装一个不再在活动存储库中可用的特定旧版本 Docker。

缺点:这是最费力且最容易出错的方法

  1. 识别基础操作系统:第一个也是最重要的步骤是认识到安装过程受底层 Linux 发行版(例如 Ubuntu、Debian)而非 Cinnamon 桌面环境的支配。使用 lsb_release -a 是必不可少的。

  2. 使用官方存储库:出于安全性、稳定性和长期可维护性的原因,对于生产或稳定的开发系统,唯一推荐的安装方法是通过 Docker 的官方 apt 存储库。

  3. 正确处理代号:在设置存储库时,使用正确的 VERSION_CODENAME 至关重要。对于 Linux Mint 用户尤其如此,他们必须手动替换底层 Ubuntu 基础的代号。

  4. 配置非 root 访问:将当前用户添加到 docker 组的安装后步骤应被视为强制性配置。它能够实现无缝且安全的开发工作流程,而无需持续使用 sudo。

  5. 首选 Docker 引擎:对于 Linux 上的大多数开发、脚本编写和基于服务器的任务,由于其性能、效率和直接的系统集成,本地 Docker 引擎是优于 Docker Desktop 的选择。

相关内容