如何在 Ubuntu 系统上安装 Docker – wiki基地


在 Ubuntu 系统上安装 Docker 的详细指南

引言

Docker 已经成为现代软件开发和运维领域不可或缺的工具。它通过容器化技术,让开发者能够将应用程序及其所有依赖项打包到一个独立的、可移植的容器中,然后部署到任何支持 Docker 的环境中。这极大地简化了应用程序的构建、发布和运行过程,解决了“在我机器上运行得好好的”的问题。

Ubuntu 作为最受欢迎的 Linux 发行版之一,是许多开发者和服务器的首选操作系统。因此,掌握如何在 Ubuntu 系统上安装和配置 Docker 是非常有价值的技能。

本文将提供一个详细的步骤指南,教您如何在 Ubuntu 系统上安装 Docker Engine、Docker CLI 以及 Containerd 等核心组件,并涵盖安装后的基本配置和使用方法。我们将重点介绍官方推荐的通过 Docker 仓库进行安装的方法,因为它能确保您获得最新、最稳定的版本。

什么是 Docker?核心组件简介

在深入安装步骤之前,我们先简单了解一下 Docker 的主要组件:

  1. Docker Engine: 这是 Docker 的核心部分,负责运行容器。它包含以下主要组件:
    • Docker Daemon (dockerd): 运行在宿主机上的后台服务,负责管理 Docker 对象(如镜像、容器、网络、数据卷)。
    • Docker CLI (Command Line Interface): 命令行工具,用户通过它与 Docker Daemon 进行交互,执行各种 Docker 命令,如 docker rundocker builddocker ps 等。
    • REST API: Docker Daemon 通过 REST API 暴露接口,供 CLI 或其他程序调用。
  2. Containerd: 一个行业标准的容器运行时,Docker Engine 依赖它来管理容器的生命周期(创建、启动、停止、删除等)。它比早期 Docker 使用的 LXC 更轻量级和标准化。
  3. Docker Compose: 用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令(docker-compose updocker compose up)即可创建和启动所有服务。Docker Compose 插件通常会与 Docker Engine 一起安装。

我们的安装目标就是让这些核心组件在您的 Ubuntu 系统上协同工作。

前提条件

在开始安装之前,请确保您的 Ubuntu 系统满足以下条件:

  1. Ubuntu 版本: Docker 支持多种 Ubuntu 版本,包括但不限于 LTS (长期支持) 版本,如 Ubuntu 20.04 (Focal Fossa) 和 Ubuntu 22.04 (Jammy Jellyfish),以及较新的非 LTS 版本。建议使用 LTS 版本以获得更长时间的支持和稳定性。您的 Ubuntu 版本必须是 64 位的。
  2. 用户权限: 您需要一个具有 sudo 权限的用户账户来执行安装命令。
  3. 网络连接: 安装过程需要从互联网下载软件包和 Docker 镜像,因此请确保您的系统连接到网络。
  4. 卸载旧版本 (如果存在): 如果您的系统之前安装过旧版本的 Docker(例如通过 apt install docker 或其他非官方方式安装的),建议先完全卸载它们,以避免冲突。我们将在稍后的卸载部分提供命令。

推荐的安装方法:使用 Docker 官方仓库

Docker 官方仓库提供了最新版本的 Docker Engine,这是最推荐的安装方式。以下是详细步骤:

步骤 1:更新 apt 包索引

在安装任何新软件包之前,最好先更新系统的包索引,以确保您能获取到软件包的最新信息。

打开终端,运行以下命令:

bash
sudo apt update

这个命令会从 Ubuntu 配置的软件源(包括 Docker 官方仓库,我们稍后会添加)下载最新的软件包列表。

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

安装 Docker 需要一些前置软件包,用于安全地通过 HTTPS 连接到仓库、管理 GPG 密钥等。

运行以下命令安装这些依赖:

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

  • ca-certificates: 允许系统检查 SSL/TLS 证书,确保连接安全。
  • curl: 用于从网络下载文件(例如 Docker 的 GPG 密钥)。
  • gnupg: 用于管理 GPG 密钥,用于验证下载的软件包的真实性。
  • lsb-release: 用于确定您的 Ubuntu 发行版信息,以便正确添加 Docker 仓库。

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

为了验证您下载的 Docker 软件包是来自官方且未被篡改,您需要导入 Docker 官方的 GPG 公钥。

首先,创建一个目录来存放 GPG 密钥环,并设置正确的权限:

bash
sudo mkdir -p /etc/apt/keyrings
sudo chmod a+r /etc/apt/keyrings

然后,使用 curl 下载 Docker 的 GPG 公钥,并通过 gpg --dearmor 解密并转换格式,最后使用 tee 将其保存到 /etc/apt/keyrings/docker.gpg 文件中:

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

  • curl -fsSL: -f 在 HTTP 错误时静默失败;-s 静默模式,不显示进度或错误信息;-S 显示错误(即使在静默模式下);-L 如果服务器返回重定向,则跟踪重定向。
  • |: 将 curl 的输出通过管道传递给下一个命令。
  • sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg: 使用 gpg 命令将标准的 OpenPGP 格式的密钥转换成 apt 兼容的格式,并保存到指定文件。sudo 是必需的,因为目标目录 /etc/apt/keyrings 需要 root 权限才能写入。

现在,Docker 的 GPG 密钥已经安全地存储在您的系统中,apt 可以使用它来验证 Docker 仓库中的软件包签名。

步骤 4:添加 Docker 官方仓库

接下来,您需要将 Docker 的官方仓库添加到您的 apt 源列表中。这将告诉您的系统从哪里下载 Docker 软件包。

使用以下命令添加仓库。该命令会根据您的 Ubuntu 版本自动确定正确的仓库地址:

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 "...": 输出一个字符串,这个字符串定义了 Docker 仓库的格式。
    • deb: 表示这是一个标准的 Debian/Ubuntu 二进制软件包仓库。
    • [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]: 这是一个选项块。
      • arch=$(dpkg --print-architecture): 自动检测您的系统架构(如 amd64)。这确保您只添加适合您架构的仓库。
      • signed-by=/etc/apt/keyrings/docker.gpg: 指定用于验证此仓库中软件包签名的 GPG 密钥文件的位置。
    • https://download.docker.com/linux/ubuntu: Docker 仓库的基本 URL。
    • $(lsb_release -cs): 执行 lsb_release -cs 命令,输出您的 Ubuntu 版本代号(例如,对于 Ubuntu 22.04 是 jammy,对于 Ubuntu 20.04 是 focal)。这确保您添加的是对应您 Ubuntu 版本的仓库分支。
    • stable: 指定使用 stable 仓库分支。Docker 还提供 testnightly 分支,但对于大多数用户,stable 是最佳选择。
  • |: 将 echo 的输出通过管道传递给 tee 命令。
  • sudo tee /etc/apt/sources.list.d/docker.list: 使用 tee 命令将通过管道接收到的内容写入 /etc/apt/sources.list.d/docker.list 文件。这个文件是 apt 用来查找额外软件源的标准位置。tee 需要 sudo 权限才能写入这个文件。
  • > /dev/null: 将 tee 的标准输出重定向到 /dev/null,避免在终端上重复显示添加到文件中的内容。

现在,您的系统已经知道 Docker 官方仓库的位置了。

步骤 5:再次更新 apt 包索引

添加新的仓库后,需要再次更新 apt 包索引,以便系统能够识别新仓库中的软件包。

bash
sudo apt update

这次更新会从 Docker 官方仓库下载 Docker 软件包的列表信息。

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

现在,您可以安装 Docker 的核心组件了。

运行以下命令:

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

  • docker-ce: Docker Community Edition (社区版) Engine 本身。
  • docker-ce-cli: Docker 命令行客户端。
  • containerd.io: Containerd 容器运行时。
  • docker-buildx-plugin: 用于构建多平台镜像的插件。
  • docker-compose-plugin: Docker Compose 的插件版本(推荐使用 docker compose 命令而非旧的 docker-compose 命令)。

apt 会计算依赖关系并提示您确认安装。输入 Y 并按回车继续。

安装完成后,Docker Daemon (dockerd) 应该会自动启动。您可以使用 systemctl 命令检查其状态:

bash
sudo systemctl status docker

如果它正在运行,您会看到状态显示为 active (running)

步骤 7:验证 Docker 安装

最简单有效的验证方法是运行 Docker 提供的 hello-world 容器。这个容器非常小,它会打印一条消息,然后退出。

运行以下命令:

bash
sudo docker run hello-world

如果您看到类似以下内容的输出:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
... (下载过程) ...
Hello from Docker!
This message shows that your installation appears to be working correctly.
... (更多说明文字) ...

这意味着 Docker 已经成功安装并且可以正常运行了!

步骤 8:以非 root 用户管理 Docker (重要!)

默认情况下,docker 命令需要 sudo 权限才能运行。这意味着每次执行 Docker 命令时都需要输入密码,这很不方便,而且并非最佳实践。为了能够以非 root 用户身份运行 Docker 命令,您需要将您的用户添加到 docker 用户组中。

在安装过程中,Docker 安装程序会自动创建一个名为 docker 的用户组。

运行以下命令将当前用户添加到 docker 用户组:

bash
sudo usermod -aG docker $USER

  • sudo usermod: 修改用户账户信息。
  • -aG docker: -a 选项表示“追加”用户到指定组,-G docker 指定要追加到的组是 docker
  • $USER: 这是一个环境变量,代表当前登录用户的用户名。

重要提示: 将用户添加到组的更改并不会立即生效,直到用户下次登录为止。因此,您需要注销并重新登录(或者重启系统)才能使更改生效。

重新登录后,您应该就可以在不使用 sudo 的情况下运行 Docker 命令了。再次验证:

bash
docker run hello-world

如果命令成功执行而没有提示权限错误,那么恭喜您,非 root 用户配置成功!

注意: docker 组的成员拥有与 root 用户等同的权限来管理 Docker Daemon,这涉及到对系统资源的访问。因此,将用户添加到 docker 组应该谨慎进行,只添加到受信任的用户账户。

Docker 的基本使用

安装完成后,您可以开始使用 Docker 了。这里是一些最常用的基本命令:

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]: 运行一个新容器。
    • docker run ubuntu bash: 在一个基于 ubuntu 镜像的新容器中运行 bash 命令。
    • docker run -d nginx: 以后台模式运行一个 nginx 容器。
    • docker run -p 80:80 my-web-app: 将宿主机的 80 端口映射到容器的 80 端口,并运行名为 my-web-app 的镜像。
  • docker ps [OPTIONS]: 列出正在运行的容器。
    • docker ps -a: 列出所有容器,包括已停止的。
  • docker images [OPTIONS]: 列出本地的 Docker 镜像。
  • docker pull NAME[:TAG]: 从 Docker Hub 或其他仓库拉取(下载)一个镜像。
    • docker pull ubuntu:latest: 拉取最新版的 ubuntu 镜像。
  • docker stop CONTAINER [CONTAINER...]: 停止一个或多个正在运行的容器(通过容器 ID 或名称)。
  • docker rm CONTAINER [CONTAINER...]: 删除一个或多个已停止的容器。
  • docker rmi IMAGE [IMAGE...]: 删除一个或多个本地镜像。

其他安装方法 (简要提及)

虽然通过 Docker 官方仓库是推荐的方法,但在某些特定情况下,您可能也会遇到或需要了解其他安装方式:

  1. 使用 Snapd 安装:
    Ubuntu 内置了对 Snapd 的支持,Docker 也在 Snap Store 中提供了一个包。

    • 安装命令:sudo snap install docker
    • 优点:安装简单,通常易于更新。
    • 缺点:Snap 包的更新可能不如官方仓库及时,有时候在某些方面(如与系统服务的集成、访问某些文件系统路径)可能存在限制或行为差异。Docker 官方文档通常不推荐这种方法用于生产环境。
    • 如果使用 Snap 安装,非 root 用户运行 docker 命令的方法略有不同,通常是将用户添加到 snap_docker 组,或者使用 snap alias docker.docker docker 并确保 snap bin 目录在 PATH 中。
  2. 使用 convenience script 安装:
    Docker 官方提供了一个便捷脚本,可以快速安装 Docker。

    • 下载并运行:curl -fsSL https://get.docker.com -o get-docker.sh 然后 sudo sh get-docker.sh
    • 优点:非常快速方便,适合在开发或测试环境中快速搭建。
    • 缺点:不适合生产环境,因为它是非交互式的,没有详细的配置选项,并且可能在安装过程中跳过一些安全检查或最佳实践。
  3. 手动安装:
    您可以直接从 download.docker.com 下载特定版本的 Docker 包 (.deb 文件),然后手动安装。

    • 优点:可以精确控制安装的版本,即使在没有互联网连接的情况下(如果已经下载好包)也可以安装。
    • 缺点:过程繁琐,需要手动处理依赖关系和更新。不推荐给大多数用户。

总结: 对于绝大多数用户,特别是在生产或重要的开发环境中,强烈建议使用 Docker 官方仓库进行安装。

Docker 的一些高级配置

配置 Docker 镜像加速器

在中国大陆等地区,由于网络原因,从 Docker Hub 下载镜像可能会非常慢。配置镜像加速器可以显著提高下载速度。

许多云服务提供商(如阿里云、腾讯云等)以及国内的互联网公司都提供了 Docker 镜像加速服务。您需要获取一个镜像加速器地址。

配置方法通常是在 Docker 的配置文件 /etc/docker/daemon.json 中添加或修改 registry-mirrors 字段。如果文件不存在,就创建一个。

例如,使用一个虚构的加速器地址:

bash
sudo nano /etc/docker/daemon.json

添加以下内容(请将 YOUR_MIRROR_URL 替换为您实际获取到的加速器地址):

json
{
"registry-mirrors": ["https://YOUR_MIRROR_URL"]
}

如果您有多个加速器地址,可以添加多个:

json
{
"registry-mirrors": [
"https://YOUR_MIRROR_URL_1",
"https://YOUR_MIRROR_URL_2"
]
}

保存并关闭文件。

更改配置文件后,需要重启 Docker Daemon 使配置生效:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

配置 Docker 自启动

通过官方仓库安装的 Docker 通常会自动配置为开机自启动。您可以使用以下命令确认或启用:

“`bash

检查是否已启用自启动

sudo systemctl is-enabled docker

如果未启用,则启用自启动

sudo systemctl enable docker

检查 Docker 服务当前状态

sudo systemctl status docker
“`

升级 Docker

使用 apt 安装 Docker 的优点之一是升级非常方便。只需像升级其他软件包一样操作:

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

这将升级所有通过 apt 安装的 Docker 相关软件包到仓库中的最新版本。

卸载 Docker

如果出于某种原因需要卸载 Docker,您可以按照以下步骤操作:

  1. 停止并删除所有容器和镜像 (可选但推荐):
    在卸载 Docker Engine 之前,最好先停止并删除所有正在运行的容器,以及删除不再需要的镜像、数据卷和网络,以免留下残留数据。

    “`bash

    停止所有运行的容器

    sudo docker stop $(sudo docker ps -a -q)

    删除所有容器

    sudo docker rm $(sudo docker ps -a -q)

    删除所有镜像

    sudo docker rmi $(sudo docker images -q)

    清理未使用的网络、数据卷等(谨慎操作,会删除所有未使用的 Docker 数据)

    sudo docker system prune –all –volumes

    ``
    请注意,
    sudo docker system prune –all –volumes` 命令会删除所有停止的容器、未使用的网络、悬挂的镜像、未使用的构建缓存以及所有未使用的卷。请谨慎使用此命令,确保您了解其影响。

  2. 卸载 Docker 软件包:
    运行以下命令卸载 Docker Engine、CLI、Containerd 等软件包:

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

    purge 命令除了卸载软件包,还会删除其相关的配置文件。

  3. 删除残留的数据目录:
    Docker 的默认工作目录是 /var/lib/docker,其中存放着镜像、容器、数据卷等数据。卸载软件包并不会自动删除这个目录。如果您想彻底清除所有 Docker 数据,需要手动删除它:

    bash
    sudo rm -rf /var/lib/docker

    请注意: 执行此命令将永久删除所有 Docker 数据,包括您创建的所有容器、镜像、数据卷等。请务必备份重要数据。

  4. 删除 Docker 仓库配置和 GPG 密钥 (可选):
    如果您不打算再安装 Docker,也可以删除之前添加的仓库配置和 GPG 密钥。

    “`bash

    删除仓库配置文件

    sudo rm /etc/apt/sources.list.d/docker.list

    删除 GPG 密钥文件

    sudo rm /etc/apt/keyrings/docker.gpg
    “`

完成以上步骤后,Docker 及其相关数据就应该从您的 Ubuntu 系统中彻底移除了。

常见问题与故障排除

  1. docker: command not found:

    • 原因:Docker 没有正确安装,或者 Docker 的安装目录不在系统的 PATH 环境变量中,或者您使用了非 root 用户但没有将其添加到 docker 组并且没有重新登录。
    • 解决:
      • 重新检查安装步骤,特别是步骤 6 和 7。
      • 如果您将用户添加到了 docker 组,请确保您已经注销并重新登录。
      • 检查 /usr/bin/docker 是否存在。
  2. Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock:

    • 原因:您正在尝试以一个不属于 docker 用户组的用户运行 Docker 命令。
    • 解决:按照步骤 8 将您的用户添加到 docker 组,然后注销并重新登录。
  3. Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?:

    • 原因:Docker Daemon (dockerd) 没有运行。
    • 解决:
      • 检查 Docker 服务状态:sudo systemctl status docker
      • 尝试启动 Docker 服务:sudo systemctl start docker
      • 如果启动失败,查看日志获取更多信息:sudo journalctl -u docker.service
  4. 安装时提示某个软件包找不到或版本不对:

    • 原因:可能是 apt update 没有执行,或者 Docker 仓库没有正确添加,或者您的 Ubuntu 版本不受支持或仓库分支选择错误。
    • 解决:
      • 确保您执行了两次 sudo apt update (在步骤 1 和步骤 5)。
      • 仔细检查步骤 3 和步骤 4,确认 GPG 密钥和仓库地址是否正确添加,特别是 Ubuntu 版本代号 ($(lsb_release -cs)) 是否正确。
      • 确认您的 Ubuntu 版本是否在 Docker 支持列表内。
  5. 镜像下载速度慢:

    • 原因:网络连接问题或没有配置镜像加速器。
    • 解决:配置 Docker 镜像加速器(参考前面章节)。

结论

通过本指南,您应该已经在 Ubuntu 系统上成功安装了 Docker Engine、CLI 和 Containerd,并且配置了非 root 用户访问权限,以及了解了基本的 Docker 命令和一些高级配置。

安装 Docker 只是容器化旅程的第一步。接下来,您可以尝试构建自己的 Docker 镜像,运行更复杂的应用程序,学习如何使用 Docker Compose 管理多容器应用,探索 Docker 数据卷、网络等概念,从而更高效地进行软件开发和部署。

祝您使用 Docker 愉快!


发表评论

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

滚动至顶部