Ubuntu 安装 Docker 详细步骤 – wiki基地


在 Ubuntu 系统上安装 Docker:一篇详尽的指南

引言:拥抱容器化时代

在现代软件开发和部署中,容器化技术已经成为不可或缺的一部分。它提供了一种轻量级、可移植且一致的环境来打包应用程序及其所有依赖项,从而解决了“在我机器上可以运行”的问题。而 Docker 则是当前最流行和广泛使用的容器化平台。

Ubuntu 作为最受欢迎的 Linux 发行版之一,是许多开发者和运维人员的首选操作系统。因此,在 Ubuntu 上安装 Docker 是进行容器化实践的第一步。

本篇文章将为您提供一个详尽的 Docker 在 Ubuntu 系统上的安装指南。我们将重点介绍官方推荐的安装方法——通过 Docker 官方仓库进行安装,并详细解释每一步的操作及其背后的原因,确保您能够顺利、可靠地完成 Docker 的安装。此外,我们还将涵盖安装后的配置、验证以及一些常见的故障排除方法。

无论您是刚接触 Docker 的新手,还是希望了解最佳安装实践的经验用户,本文都将为您提供有价值的信息。

准备工作:安装前的检查

在开始安装 Docker 之前,请确保您的 Ubuntu 系统满足以下基本要求:

  1. 操作系统版本: Docker 支持多个 Ubuntu 版本。通常,Docker 官方仓库支持最新的 LTS(长期支持)版本以及一些非 LTS 版本。建议使用当前或最近的 LTS 版本,例如 Ubuntu 20.04 (Focal Fossa)、22.04 (Jammy Jellyfish) 或 24.04 (Noble Numbat)。您可以通过以下命令查看您的 Ubuntu 版本:
    bash
    lsb_release -a


    bash
    cat /etc/os-release
  2. 用户权限: 您需要一个具有 sudo(root)权限的用户账户来执行安装命令。
  3. 互联网连接: 安装过程需要从 Docker 官方仓库下载软件包,因此需要稳定的互联网连接。
  4. 移除旧版本(可选但推荐): 如果您之前安装过旧版本的 Docker(例如通过非官方渠道或旧的安装脚本),建议先将其完全卸载,以避免冲突。可以使用以下命令尝试卸载:
    bash
    sudo apt-get remove docker docker-engine docker.io containerd runc

    即使这些软件包不存在,运行此命令也不会造成问题。

完成这些检查后,我们就可以开始正式的安装流程了。

选择安装方法

安装 Docker Engine on Ubuntu 主要有以下几种方法:

  1. 使用 Docker 官方仓库(推荐): 这是在生产环境和日常开发中安装 Docker 的主要方法。通过添加 Docker 的官方 APT 仓库,您可以轻松地安装最新版本的 Docker,并在后续通过标准的 apt upgrade 命令进行更新。本文将重点详细讲解此方法。
  2. 使用便捷安装脚本: Docker 提供了一个便捷脚本,可以快速安装 Docker CE。此方法适用于测试或开发环境,但不建议用于生产环境,因为它没有利用 Ubuntu 的包管理系统进行版本控制和依赖管理。
  3. 手动下载软件包: 您可以直接下载 Docker DEB 软件包进行安装。此方法通常用于没有互联网连接的离线环境,或者需要安装特定版本的 Docker 时。这种方法依赖较多,且后续更新不便。

强烈建议使用第一种方法,即通过 Docker 官方仓库进行安装。 它提供了最佳的灵活性、易用性和可维护性。

方法一:使用 Docker 官方仓库安装(推荐)

这是最推荐的安装方法,它允许您从 Docker 官方提供的仓库获取 Docker 软件包,确保您安装的是官方、最新且经过测试的版本,并方便后续更新。

以下是详细的安装步骤:

步骤 1:更新软件包列表

在安装任何新软件包之前,首先的最佳实践是更新您的系统软件包列表。这可以确保您获取到最新版本的现有软件包信息。

bash
sudo apt update

执行此命令后,APT 会连接到 Ubuntu 配置的软件源,下载最新的软件包列表信息。您会看到类似“Reading package lists… Done”的输出。

步骤 2:安装必要的依赖软件包

为了能够通过 HTTPS 安全地访问 Docker 的官方仓库并管理其 GPG 密钥,您需要安装一些依赖软件包。

bash
sudo apt install \
ca-certificates \
curl \
gnupg \
lsb-release

  • ca-certificates: 允许 APT 通过 SSL/TLS 验证远程服务器的证书。
  • curl: 用于从指定 URL 下载文件(在此用于下载 Docker 的 GPG 密钥)。
  • gnupg: GPG 是 GNU Privacy Guard,用于管理和验证软件签名(在此用于验证 Docker 软件包的真实性)。
  • lsb-release: 用于帮助您找到 Ubuntu 发行版的名称和版本号,以便正确配置 Docker 仓库。

执行此命令,APT 会检查这些软件包是否已安装,如果未安装则会提示您安装。确认后按 Y 并回车进行安装。

步骤 3:添加 Docker 的官方 GPG 密钥

为了验证您从 Docker 官方仓库下载的软件包是真实且未被篡改的,您需要添加 Docker 的官方 GPG 密钥到您的系统。

首先,创建一个目录来存储 GPG 密钥:

bash
sudo mkdir -m 0755 -p /etc/apt/keyrings

这个命令创建了 /etc/apt/keyrings 目录,并设置了合适的权限(所有者读写执行,组用户和其他用户只读执行)。这是一个推荐的存储外部仓库 GPG 密钥的位置。

然后,使用 curl 下载 Docker 的官方 GPG 密钥,并将其保存到刚刚创建的目录中:

bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

  • curl -fsSL: -f (fail) 在 HTTP 错误时静默失败,-s (silent) 静默模式,-S (show-error) 在静默模式下显示错误,-L (location) 如果遇到重定向则跟随重定向。
  • https://download.docker.com/linux/ubuntu/gpg: 这是 Docker 官方提供的 Ubuntu 仓库的 GPG 密钥 URL。
  • |: 管道符,将 curl 命令的输出(密钥内容)作为输入传递给下一个命令。
  • sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg: gpg --dearmor 用于将 ASCII armored 格式的 GPG 密钥转换为二进制格式。sudo 以 root 权限执行此操作,-o 指定输出文件路径 /etc/apt/keyrings/docker.gpg

此命令不会有太多输出,成功执行后,Docker 的 GPG 密钥文件 docker.gpg 将被安全地存储在 /etc/apt/keyrings/ 目录下。

您可以通过以下命令验证密钥是否已正确添加(可选步骤):

bash
sudo gpg --no-default-keyring --keyring /etc/apt/keyrings/docker.gpg --fingerprint 0EBFCD88

此命令会显示添加到 /etc/apt/keyrings/docker.gpg 密钥环中的指纹为 0EBFCD88 的密钥信息。您应该能看到类似以下内容:

/etc/apt/keyrings/docker.gpg
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 3B37 8AEE 248A B9C2 C208 31BB CD65
uid [ unknown] Docker Release (CE deb) <[email protected]>
sub rsa4096 2017-02-22 [S]

指纹 9DC8 5822 9FC7 3B37 8AEE 248A B9C2 C208 31BB CD65 或类似信息表明密钥已成功添加。

步骤 4:添加 Docker 仓库到 APT 源列表

现在,您需要将 Docker 的官方仓库添加到您的 APT 源列表中,以便 APT 知道从哪里下载 Docker 软件包。

使用以下命令添加仓库:

bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

  • echo "...": 输出包含仓库信息的字符串。
    • deb: 指示这是一个 debian 软件包仓库。
    • [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]: 这部分是仓库的选项。
      • arch=$(dpkg --print-architecture): 指定系统的架构(例如 amd64)。$(dpkg --print-architecture) 会自动检测当前系统的架构。
      • signed-by=/etc/apt/keyrings/docker.gpg: 指定用于验证此仓库软件包的 GPG 密钥文件路径。这是 APT 4.0 及以上版本推荐的安全做法,取代了直接将密钥导入到系统的信任密钥环中。
    • https://download.docker.com/linux/ubuntu: Docker 官方 Ubuntu 仓库的 URL。
    • $(lsb_release -cs): 自动获取当前 Ubuntu 发行版的代号(例如 focal、jammy)。这样,APT 就会配置为下载对应版本的 Docker 软件包。
    • stable: 指定使用 stable 仓库分支。Docker 也提供 testnightly 分支,但在绝大多数情况下,stable 是推荐的选择。
  • |: 管道符,将 echo 命令的输出传递给 tee 命令。
  • sudo tee /etc/apt/sources.list.d/docker.list: tee 命令用于将标准输入的内容写入到指定文件中,同时也在标准输出上显示(我们通过 > /dev/null 将标准输出重定向到空设备,所以你看不到输出)。sudo 允许以 root 权限写入 /etc/apt/sources.list.d/ 目录下的文件。将仓库信息保存在 /etc/apt/sources.list.d/ 目录下的独立文件(例如 docker.list)是一种组织 APT 源的好习惯。
  • > /dev/null: 将 tee 的标准输出重定向到 /dev/null,避免在终端上显示仓库信息。

执行此命令后,一个名为 docker.list 的文件将在 /etc/apt/sources.list.d/ 目录下创建,其中包含了 Docker 仓库的配置信息。

您可以通过以下命令查看文件内容来验证(可选步骤):

bash
cat /etc/apt/sources.list.d/docker.list

输出应该与您 echo 中的内容相似。

步骤 5:再次更新软件包列表

在添加了新的软件仓库后,您需要再次更新 APT 的软件包列表,以便它能够识别并从新的 Docker 仓库获取软件包信息。

bash
sudo apt update

这次更新后,APT 会连接到 Docker 仓库,下载 Docker 软件包的元数据。您应该在输出中看到与 download.docker.com 相关的软件包信息获取过程。

步骤 6:安装 Docker Engine、CLI 和 Containerd

现在,APT 已经知道在哪里找到 Docker 软件包了。您可以安装 Docker 的核心组件了。

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

  • docker-ce: Docker Community Edition(社区版)引擎本身。
  • docker-ce-cli: Docker 命令行客户端,用于与 Docker 引擎交互。
  • containerd.io: 一个行业标准的容器运行时,Docker 引擎使用它来管理容器的生命周期。
  • docker-buildx-plugin: Docker BuildX 插件,用于改进构建镜像的功能,支持多平台构建。
  • docker-compose-plugin: Docker Compose V2 插件,用于定义和运行多容器 Docker 应用程序。

执行此命令后,APT 会列出需要安装的软件包及其依赖项,并询问您是否继续。输入 Y 并回车确认安装。

安装完成后,Docker 服务通常会自动启动并配置为在系统启动时自动运行。

步骤 7:验证安装

安装完成后,验证 Docker 是否已正确安装并正在运行是至关重要的。最简单的方法是运行 Docker 提供的 hello-world 示例容器。

bash
sudo docker run hello-world

  • sudo docker run: 以 root 权限执行 docker run 命令。
  • hello-world: 这是 Docker Hub 上的一个非常小的测试镜像。

当您第一次运行此命令时,Docker 引擎会执行以下操作:

  1. 检查本地是否存在名为 hello-world 的镜像。
  2. 如果不存在(第一次运行时通常如此),它会从 Docker Hub 下载该镜像。
  3. 使用该镜像创建一个新的容器。
  4. 在该容器中运行一个简单的程序,该程序会输出一段问候语。
  5. 程序执行完毕后,容器停止。

如果一切顺利,您将在终端上看到类似以下内容的输出:

“`
Unable to find image ‘hello-world:latest’ locally
latest: Pulling from library/hello-world
… (下载进度信息) …
Digest: sha256:…
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the “hello-world” image from the Docker Hub.
(Assuming it was not already locally available.)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
“`

看到 “Hello from Docker!” 字样及其解释,就表明 Docker Engine 已经成功安装并能够正常运行容器了。

安装后的配置(非常重要)

默认情况下,docker 命令需要 root 权限(即在前面加上 sudo)才能执行。这虽然保证了安全性,但在日常使用中非常不便。为了让您的普通用户也能直接运行 docker 命令,需要进行额外的配置。

将用户添加到 docker 用户组

在 Docker 安装过程中,会自动创建一个名为 docker 的用户组。Docker 守护进程启动时,会创建一个 Unix socket,并将其所有权设置为 root:docker,同时设置读写权限,使得 docker 用户组的成员可以通过该 socket 与 Docker 守护进程通信,而无需 root 权限。

要允许您的用户无需 sudo 运行 Docker 命令,需要将您的用户添加到 docker 用户组。

  1. 将当前用户添加到 docker 组:

    bash
    sudo usermod -aG docker $USER

    • sudo usermod: 用于修改用户账户。
    • -aG docker: -a 表示追加(append),-G 表示指定附加组。此选项表示将用户添加到指定的附加组 docker 中,而不是替换其现有组。
    • $USER: 这是一个环境变量,代表当前登录用户的用户名。
  2. 使组成员身份生效: 将用户添加到 docker 组后,新的组成员身份并不会立即在当前登录会话中生效。您需要完全注销当前用户,然后重新登录,或者重启您的系统,以便使组更改生效。

    简单的注销并重新登录通常就足够了。

  3. 验证非 root 用户权限: 重新登录后,尝试在不使用 sudo 的情况下运行 docker 命令:

    bash
    docker run hello-world

    如果命令成功执行并显示 “Hello from Docker!” 的输出,则表明您现在可以在没有 sudo 的情况下运行 Docker 命令了。

    如果您看到权限错误(例如 Got permission denied while trying to connect to the Docker daemon socket...),请确认您是否已注销并重新登录。如果问题仍然存在,可以尝试重启系统。

注意: 将用户添加到 docker 组会赋予该用户与 root 用户几乎同等的对 Docker 守护进程的控制权。这意味着该用户可以运行任何容器,包括那些可能挂载了系统文件系统或具有特殊权限的容器。因此,请谨慎授予此权限,仅将可信用户添加到 docker 组。

配置 Docker 随系统启动(Systemd)

Docker 安装程序通常会自动将 Docker 配置为使用 Systemd 启动,并在系统启动时自动运行。您可以使用以下命令来检查和管理 Docker 服务的状态:

  • 检查 Docker 服务状态:
    bash
    sudo systemctl status docker

    您应该看到 active (running) 的状态,表明服务正在运行。

  • 如果 Docker 服务未启动,可以手动启动它:
    bash
    sudo systemctl start docker

  • 配置 Docker 在系统启动时自动启动(如果尚未配置):
    bash
    sudo systemctl enable docker

    此命令会创建一个符号链接,确保 Docker 服务在启动时被激活。

其他安装方法(简述)

虽然推荐使用官方仓库安装,但了解其他方法也有助于理解 Docker 的安装机制。

使用便捷安装脚本

Docker 提供了一个脚本,可以快速在许多 Linux 发行版上安装 Docker CE。

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

这个脚本会检测您的操作系统,下载并安装最新版本的 Docker。它通常会安装到 /usr/bin/docker 等位置,并配置服务。

优点: 简单快捷,适用于测试和开发。
缺点: 不使用系统包管理器,后续更新需要再次运行脚本或手动管理,版本控制不便,不推荐用于生产环境。

手动下载软件包

您可以从 Docker 官方下载页面(https://download.docker.com/linux/ubuntu/dists/<UBUNTU_CODENAME>/pool/stable/<ARCH>/,将 <UBUNTU_CODENAME> 替换为您的 Ubuntu 代号,<ARCH> 替换为架构)下载 docker-ce_<VERSION>_amd64.debdocker-ce-cli_<VERSION>_amd64.deb 等文件,然后使用 dpkg 命令手动安装。

bash
sudo dpkg -i /path/to/downloaded/package.deb

这种方法需要您手动处理所有依赖关系,并且后续更新非常麻烦。主要用于没有互联网连接的环境。

优点: 适用于离线环境。
缺点: 复杂,依赖手动解决,更新困难,不推荐用于日常安装。

Docker 基本命令验证

安装并配置完成后,您可以尝试一些基本的 Docker 命令来进一步熟悉和验证您的安装:

  • 查看 Docker 版本信息:
    bash
    docker version

    会显示 Docker Engine、Client、Containerd、RunC 等组件的版本信息。

  • 查看 Docker 系统信息:
    bash
    docker info

    会显示更详细的 Docker 守护进程配置、存储驱动、网络信息等。

  • 列出本地已下载的 Docker 镜像:
    bash
    docker images

    如果之前运行过 hello-world,您应该会看到 hello-world 镜像。

  • 列出当前正在运行的容器:
    bash
    docker ps

  • 列出所有容器(包括已停止的):
    bash
    docker ps -a

故障排除(常见问题)

在安装或配置过程中,您可能会遇到一些问题。以下是一些常见问题及其解决方案:

  1. 权限被拒绝 (Got permission denied while trying to connect to the Docker daemon socket):

    • 问题原因: 您的用户没有权限访问 Docker 守护进程的 Unix socket,通常是因为用户不在 docker 用户组中,或者组更改尚未生效。
    • 解决方案: 确保您的用户已通过 sudo usermod -aG docker $USER 命令添加到 docker 用户组,并且您已经完全注销当前会话并重新登录(或重启系统)。
  2. 无法找到 Docker 软件包 (Unable to locate package docker-ce):

    • 问题原因: APT 没有找到 Docker 仓库或仓库配置有误。
    • 解决方案:
      • 检查 /etc/apt/sources.list.d/docker.list 文件是否存在且内容是否正确(仓库 URL、Ubuntu 代号、GPG 密钥路径是否匹配)。
      • 确保已正确执行了添加 GPG 密钥的步骤。
      • 确保已执行了 sudo apt update 来更新软件包列表。
      • 检查您的 Ubuntu 版本是否受 Docker 支持。
  3. GPG 密钥错误 (NO_PUBKEY ...):

    • 问题原因: APT 无法验证 Docker 仓库的 GPG 签名,通常是因为 GPG 密钥未正确添加。
    • 解决方案: 按照步骤 3 重新执行添加 GPG 密钥的命令,确保命令没有报错,并且密钥文件 docker.gpg 存在于 /etc/apt/keyrings/ 目录下。然后再次运行 sudo apt update
  4. Docker 服务未运行 (docker: Cannot connect to the Docker daemon at ...):

    • 问题原因: Docker 守护进程没有启动或运行异常。
    • 解决方案:
      • 使用 sudo systemctl status docker 检查服务状态。
      • 如果服务未运行,尝试使用 sudo systemctl start docker 启动它。
      • 如果启动失败或状态显示错误,查看服务日志 sudo journalctl -u docker.service 来获取更多错误信息。
  5. 互联网连接问题:

    • 问题原因: 在下载软件包、GPG 密钥或 Docker 镜像时,由于网络问题导致连接失败。
    • 解决方案: 检查您的网络连接,确保能够访问 download.docker.comhub.docker.com。在某些网络环境下,可能需要配置代理。

更新 Docker

通过官方仓库安装 Docker 的一个主要好处是更新非常方便。只需运行标准的系统更新命令:

bash
sudo apt update
sudo apt upgrade

如果 Docker 有新版本可用,apt upgrade 命令会自动下载并安装它们。

卸载 Docker

如果您需要卸载 Docker,可以按照以下步骤操作:

  1. 卸载 Docker Engine、CLI 和 Containerd 软件包:
    bash
    sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

    purge 命令会同时删除软件包及其配置文件。

  2. 删除所有镜像、容器、卷和网络(可选但通常需要):
    bash
    sudo rm -rf /var/lib/docker
    sudo rm -rf /var/lib/containerd

    注意: 这将删除所有 Docker 数据,包括您的容器、镜像、数据卷和自定义网络。请谨慎操作并确保您已备份重要数据。

  3. 移除 Docker 仓库配置和 GPG 密钥(可选):
    bash
    sudo rm /etc/apt/sources.list.d/docker.list
    sudo rm /etc/apt/keyrings/docker.gpg

完成这些步骤后,Docker 及其相关数据就会从您的系统中移除。

结论

通过遵循本指南中的详细步骤,您应该能够在 Ubuntu 系统上成功安装 Docker Engine,并进行必要的后安装配置,使其能够方便地使用。通过官方仓库安装是推荐的方法,它保证了安装的可靠性、后续更新的便捷性以及软件包的安全性。

安装 Docker 只是容器化旅程的第一步。接下来,您可以开始学习如何构建自己的 Docker 镜像(使用 Dockerfile)、运行和管理容器、使用 Docker Compose 编排多容器应用,以及探索更高级的 Docker 功能,如网络、数据卷和 Swarm/Kubernetes 集成。

祝您在容器化的世界中探索愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部