在 Ubuntu 系统上安装 Docker 的详细指南
引言
Docker 已经成为现代软件开发和运维领域不可或缺的工具。它通过容器化技术,让开发者能够将应用程序及其所有依赖项打包到一个独立的、可移植的容器中,然后部署到任何支持 Docker 的环境中。这极大地简化了应用程序的构建、发布和运行过程,解决了“在我机器上运行得好好的”的问题。
Ubuntu 作为最受欢迎的 Linux 发行版之一,是许多开发者和服务器的首选操作系统。因此,掌握如何在 Ubuntu 系统上安装和配置 Docker 是非常有价值的技能。
本文将提供一个详细的步骤指南,教您如何在 Ubuntu 系统上安装 Docker Engine、Docker CLI 以及 Containerd 等核心组件,并涵盖安装后的基本配置和使用方法。我们将重点介绍官方推荐的通过 Docker 仓库进行安装的方法,因为它能确保您获得最新、最稳定的版本。
什么是 Docker?核心组件简介
在深入安装步骤之前,我们先简单了解一下 Docker 的主要组件:
- Docker Engine: 这是 Docker 的核心部分,负责运行容器。它包含以下主要组件:
- Docker Daemon (
dockerd
): 运行在宿主机上的后台服务,负责管理 Docker 对象(如镜像、容器、网络、数据卷)。 - Docker CLI (Command Line Interface): 命令行工具,用户通过它与 Docker Daemon 进行交互,执行各种 Docker 命令,如
docker run
、docker build
、docker ps
等。 - REST API: Docker Daemon 通过 REST API 暴露接口,供 CLI 或其他程序调用。
- Docker Daemon (
- Containerd: 一个行业标准的容器运行时,Docker Engine 依赖它来管理容器的生命周期(创建、启动、停止、删除等)。它比早期 Docker 使用的 LXC 更轻量级和标准化。
- Docker Compose: 用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令(
docker-compose up
或docker compose up
)即可创建和启动所有服务。Docker Compose 插件通常会与 Docker Engine 一起安装。
我们的安装目标就是让这些核心组件在您的 Ubuntu 系统上协同工作。
前提条件
在开始安装之前,请确保您的 Ubuntu 系统满足以下条件:
- Ubuntu 版本: Docker 支持多种 Ubuntu 版本,包括但不限于 LTS (长期支持) 版本,如 Ubuntu 20.04 (Focal Fossa) 和 Ubuntu 22.04 (Jammy Jellyfish),以及较新的非 LTS 版本。建议使用 LTS 版本以获得更长时间的支持和稳定性。您的 Ubuntu 版本必须是 64 位的。
- 用户权限: 您需要一个具有
sudo
权限的用户账户来执行安装命令。 - 网络连接: 安装过程需要从互联网下载软件包和 Docker 镜像,因此请确保您的系统连接到网络。
- 卸载旧版本 (如果存在): 如果您的系统之前安装过旧版本的 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 还提供test
和nightly
分支,但对于大多数用户,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 官方仓库是推荐的方法,但在某些特定情况下,您可能也会遇到或需要了解其他安装方式:
-
使用 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 中。
- 安装命令:
-
使用 convenience script 安装:
Docker 官方提供了一个便捷脚本,可以快速安装 Docker。- 下载并运行:
curl -fsSL https://get.docker.com -o get-docker.sh
然后sudo sh get-docker.sh
- 优点:非常快速方便,适合在开发或测试环境中快速搭建。
- 缺点:不适合生产环境,因为它是非交互式的,没有详细的配置选项,并且可能在安装过程中跳过一些安全检查或最佳实践。
- 下载并运行:
-
手动安装:
您可以直接从 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,您可以按照以下步骤操作:
-
停止并删除所有容器和镜像 (可选但推荐):
在卸载 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` 命令会删除所有停止的容器、未使用的网络、悬挂的镜像、未使用的构建缓存以及所有未使用的卷。请谨慎使用此命令,确保您了解其影响。
请注意, -
卸载 Docker 软件包:
运行以下命令卸载 Docker Engine、CLI、Containerd 等软件包:bash
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
purge
命令除了卸载软件包,还会删除其相关的配置文件。 -
删除残留的数据目录:
Docker 的默认工作目录是/var/lib/docker
,其中存放着镜像、容器、数据卷等数据。卸载软件包并不会自动删除这个目录。如果您想彻底清除所有 Docker 数据,需要手动删除它:bash
sudo rm -rf /var/lib/docker
请注意: 执行此命令将永久删除所有 Docker 数据,包括您创建的所有容器、镜像、数据卷等。请务必备份重要数据。 -
删除 Docker 仓库配置和 GPG 密钥 (可选):
如果您不打算再安装 Docker,也可以删除之前添加的仓库配置和 GPG 密钥。“`bash
删除仓库配置文件
sudo rm /etc/apt/sources.list.d/docker.list
删除 GPG 密钥文件
sudo rm /etc/apt/keyrings/docker.gpg
“`
完成以上步骤后,Docker 及其相关数据就应该从您的 Ubuntu 系统中彻底移除了。
常见问题与故障排除
-
docker: command not found
:- 原因:Docker 没有正确安装,或者 Docker 的安装目录不在系统的 PATH 环境变量中,或者您使用了非 root 用户但没有将其添加到
docker
组并且没有重新登录。 - 解决:
- 重新检查安装步骤,特别是步骤 6 和 7。
- 如果您将用户添加到了
docker
组,请确保您已经注销并重新登录。 - 检查
/usr/bin/docker
是否存在。
- 原因:Docker 没有正确安装,或者 Docker 的安装目录不在系统的 PATH 环境变量中,或者您使用了非 root 用户但没有将其添加到
-
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
:- 原因:您正在尝试以一个不属于
docker
用户组的用户运行 Docker 命令。 - 解决:按照步骤 8 将您的用户添加到
docker
组,然后注销并重新登录。
- 原因:您正在尝试以一个不属于
-
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
。
- 检查 Docker 服务状态:
- 原因:Docker Daemon (
-
安装时提示某个软件包找不到或版本不对:
- 原因:可能是
apt update
没有执行,或者 Docker 仓库没有正确添加,或者您的 Ubuntu 版本不受支持或仓库分支选择错误。 - 解决:
- 确保您执行了两次
sudo apt update
(在步骤 1 和步骤 5)。 - 仔细检查步骤 3 和步骤 4,确认 GPG 密钥和仓库地址是否正确添加,特别是 Ubuntu 版本代号 (
$(lsb_release -cs)
) 是否正确。 - 确认您的 Ubuntu 版本是否在 Docker 支持列表内。
- 确保您执行了两次
- 原因:可能是
-
镜像下载速度慢:
- 原因:网络连接问题或没有配置镜像加速器。
- 解决:配置 Docker 镜像加速器(参考前面章节)。
结论
通过本指南,您应该已经在 Ubuntu 系统上成功安装了 Docker Engine、CLI 和 Containerd,并且配置了非 root 用户访问权限,以及了解了基本的 Docker 命令和一些高级配置。
安装 Docker 只是容器化旅程的第一步。接下来,您可以尝试构建自己的 Docker 镜像,运行更复杂的应用程序,学习如何使用 Docker Compose 管理多容器应用,探索 Docker 数据卷、网络等概念,从而更高效地进行软件开发和部署。
祝您使用 Docker 愉快!