终极指南:在 Ubuntu 系统上安装 Docker 的详尽教程
导言
在当今快速发展的软件开发和运维领域,容器化技术已成为不可或缺的一部分。Docker 作为其中的佼佼者,以其轻量、高效、可移植的特性,彻底改变了应用程序的构建、分发和运行方式。无论您是开发人员、运维工程师,还是对新技术充满好奇的学习者,掌握 Docker 都将为您打开一扇通往现代化应用部署的大门。
Ubuntu 作为最受欢迎的 Linux 发行版之一,拥有庞大的用户群体和活跃的社区支持,是运行 Docker 的理想平台。本教程旨在提供一份全面、细致的指南,一步步引导您在 Ubuntu 系统上成功安装和配置 Docker Engine。我们将涵盖多种安装方法、必要的先决条件、安装后的配置、基本使用示例,乃至故障排除和卸载步骤,力求覆盖您可能遇到的各种场景,确保您能够顺利地开启 Docker 之旅。
本文预计篇幅较长,旨在深入细节,不仅告诉您“如何做”,更解释“为什么这么做”,希望能帮助您不仅完成安装,更能理解其背后的原理。
一、 什么是 Docker?为什么选择它?
在深入安装步骤之前,让我们简要回顾一下 Docker 的核心概念及其优势。
- Docker 是什么? Docker 是一个开源的应用容器引擎,它允许开发者将应用及其所有依赖(库、系统工具、代码、运行时)打包到一个轻量级、可移植的容器中。这个容器可以在任何支持 Docker 的机器上运行,无论是开发者的笔记本电脑、测试环境的服务器,还是生产环境的云平台,都能保证环境的一致性。
- 核心优势:
- 环境一致性: 彻底解决“在我机器上能跑”的问题。
- 快速部署与扩展: 秒级启动容器,轻松实现应用的水平扩展。
- 资源隔离: 容器间相互隔离,互不影响,安全性更高。
- 高效资源利用: 与虚拟机相比,容器共享宿主机操作系统内核,占用资源更少。
- 简化 CI/CD: 加速持续集成和持续部署流程。
- 庞大的生态系统: Docker Hub 上有海量的官方和社区镜像可供使用。
选择在 Ubuntu 上安装 Docker,是因为 Ubuntu 的稳定性、广泛的硬件支持以及与 Docker 的良好兼容性,使其成为部署容器化应用的热门选择。
二、 安装前的准备工作(先决条件)
在开始安装 Docker Engine 之前,请确保您的 Ubuntu 系统满足以下条件:
-
支持的 Ubuntu 版本:
Docker Engine 官方支持以下 Ubuntu 的 64 位版本:- Ubuntu Jammy Jellyfish 22.04 (LTS)
- Ubuntu Impish Indri 21.10 (官方支持已结束,但仍可能工作)
- Ubuntu Focal Fossa 20.04 (LTS)
- Ubuntu Bionic Beaver 18.04 (LTS)
- 注意:请尽量使用 LTS(长期支持)版本以获得更长的维护周期。您可以通过命令
lsb_release -a
查看您的 Ubuntu 版本。
-
系统架构: Docker Engine 支持
x86_64
(或amd64
),armhf
,arm64
,s390x
架构。本教程主要基于x86_64
/amd64
架构。 -
用户权限: 您需要拥有
sudo
权限的用户账户来执行安装命令。 -
网络连接: 安装过程需要从互联网下载软件包,请确保您的系统网络连接正常。
-
卸载旧版本(如果存在):
如果您系统上之前安装过旧版本的 Docker(可能名为docker
,docker.io
, 或docker-engine
),建议先将其卸载,以避免潜在的冲突。执行以下命令:bash
sudo apt-get remove docker docker-engine docker.io containerd runc即使
apt-get
报告没有安装这些包,执行此命令也是安全的。之前 Docker 存储在/var/lib/docker/
下的内容(包括镜像、容器、卷和网络)默认不会被移除。如果您确认不再需要这些数据,可以手动删除该目录(请谨慎操作!)。
三、 Docker Engine 的安装方法
Docker 官方提供了多种在 Ubuntu 上安装 Docker Engine 的方法。我们将详细介绍最推荐的方法:使用 Docker 的官方 APT 仓库进行安装。这种方法易于管理更新,并且能确保安装的是官方维护的最新稳定版本。我们也会简要提及其他方法作为参考。
方法一:使用 Docker 官方 APT 仓库安装(强烈推荐)
这是安装 Docker 的首选方式,因为它使得安装和更新过程变得简单和可靠。
步骤 1:更新 APT 包索引并安装依赖
首先,更新您本地的包索引,确保获取到最新的软件列表。然后,安装一些必要的依赖包,这些包允许 apt
通过 HTTPS 使用仓库。
“`bash
更新包索引
sudo apt-get update
安装允许 apt 通过 HTTPS 使用仓库所需的包
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release -y
“`
ca-certificates
: 包含 CA 证书,用于验证 HTTPS 连接的安全性。curl
: 一个强大的命令行工具,用于传输数据,这里用来下载 GPG 密钥。gnupg
: GNU Privacy Guard,用于处理加密密钥,这里用来验证 Docker 软件包的签名。lsb-release
: Linux Standard Base 工具,用于识别您正在运行的 Linux 发行版及其版本,以便设置正确的 Docker 仓库。-y
: 自动确认安装过程中的提示,避免手动输入 ‘yes’。
步骤 2:添加 Docker 的官方 GPG 密钥
为了确保您下载的 Docker 软件包是官方发布且未经篡改的,需要添加 Docker 的官方 GPG (GNU Privacy Guard) 密钥。
“`bash
创建用于存放 GPG 密钥的目录(如果不存在)
sudo mkdir -p /etc/apt/keyrings
下载 Docker 的官方 GPG 密钥并保存到指定位置
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
“`
curl -fsSL ...
:-f
表示失败时不显示 HTTP 错误,-s
表示静默模式(不显示进度),-S
表示显示错误信息(如果-s
被使用),-L
表示跟随重定向。这个命令从 Docker 官网下载 GPG 密钥。|
: 管道符,将curl
下载的密钥内容传递给下一个命令。sudo gpg --dearmor -o ...
:gpg
命令用于处理密钥。--dearmor
将 ASCII 形式的密钥转换为二进制格式(通常用于 APT)。-o
指定输出文件的路径,我们将密钥保存为/etc/apt/keyrings/docker.gpg
。现代 Ubuntu 版本推荐将密钥放在/etc/apt/keyrings
目录下。sudo chmod a+r ...
: 确保所有用户都有读取该密钥文件的权限,以便apt
能够使用它进行验证。
步骤 3:设置 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 "..."
: 打印引号内的字符串。[arch=$(dpkg --print-architecture)]
: 指定仓库支持的架构。dpkg --print-architecture
会输出您系统的架构(如amd64
,arm64
)。这确保您只下载适合您架构的包。signed-by=/etc/apt/keyrings/docker.gpg
: 明确告诉apt
使用哪个 GPG 密钥来验证这个仓库的软件包签名。这是推荐的安全做法。https://download.docker.com/linux/ubuntu
: Docker 官方仓库的 URL。$(lsb_release -cs)
: 这个命令会输出您的 Ubuntu 版本的代号(如jammy
,focal
,bionic
)。这确保您使用的是与您的 Ubuntu 版本匹配的 Docker 仓库。stable
: 指定您想要使用的仓库分支。stable
是稳定版,推荐用于生产环境。您也可以选择test
或nightly
分支,但不推荐用于常规使用。| sudo tee /etc/apt/sources.list.d/docker.list
: 使用tee
命令将echo
输出的内容同时写入到/etc/apt/sources.list.d/docker.list
文件(这是存放第三方软件源配置的标准位置)并显示在终端(通过> /dev/null
将终端显示重定向到空设备,即不显示)。需要sudo
权限来写入系统目录。
步骤 4:再次更新 APT 包索引
添加了新的仓库后,需要再次更新 apt
包索引,以便 apt
能够识别来自 Docker 仓库的新软件包。
bash
sudo apt-get update
您可能会在输出中看到类似 Get: ... https://download.docker.com/linux/ubuntu jammy InRelease
的行,这表明 apt
已经成功连接并读取了 Docker 仓库的信息。
步骤 5:安装 Docker Engine、CLI、Containerd 和插件
现在,万事俱备,可以正式安装 Docker Engine 了。推荐安装最新版本的 docker-ce
(社区版引擎), docker-ce-cli
(命令行工具), containerd.io
(一个行业标准的容器运行时), docker-buildx-plugin
(用于 BuildKit 构建) 和 docker-compose-plugin
(用于集成 Docker Compose)。
“`bash
安装最新版本的 Docker Engine 及相关组件
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
“`
docker-ce
: Docker Community Edition,核心引擎守护进程。docker-ce-cli
: Docker 命令行接口(CLI),您与之交互的主要工具。containerd.io
: 底层的容器运行时,负责管理容器的生命周期。Docker Engine 建立在 containerd 之上。docker-buildx-plugin
: 提供docker buildx
命令,支持更多高级的镜像构建特性。docker-compose-plugin
: 将 Docker Compose 的功能集成到 Docker CLI 中,可以使用docker compose
命令(注意,没有连字符)。
安装过程可能需要一些时间,因为它会下载并安装所有必要的软件包及其依赖。
步骤 6:验证 Docker Engine 安装是否成功
安装完成后,Docker 服务通常会自动启动。您可以通过运行一个简单的测试镜像 hello-world
来验证安装是否成功以及 Docker 是否能正常工作。
bash
sudo docker run hello-world
如果您看到类似以下的输出,说明 Docker 安装成功并已正确运行:
“`
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.
(…)
“`
这个命令做了什么?
docker run hello-world
: 指示 Docker CLI 运行一个名为hello-world
的镜像。- Docker 守护进程首先检查本地是否存在
hello-world
镜像。 - 如果本地没有(通常第一次运行时是这样),它会从默认的公共镜像仓库 Docker Hub 上拉取(
Pulling from library/hello-world
)。 - 下载完成后,Docker 使用这个镜像创建并启动一个新的容器。
- 容器执行其预设的命令,即打印出 “Hello from Docker!” 及相关信息。
- 容器执行完毕后自动退出。
至此,您已经通过推荐的方式成功在 Ubuntu 上安装了 Docker Engine!
方法二:使用便捷脚本安装(适用于开发测试环境)
Docker 提供了一个便捷脚本,可以在线自动完成大部分安装步骤。但请注意:官方不建议在生产环境中使用此脚本,因为它会以 root 权限运行未知脚本,存在潜在的安全风险。它主要用于快速搭建开发或测试环境。
如果您理解风险并决定使用,命令如下:
“`bash
下载脚本
curl -fsSL https://get.docker.com -o get-docker.sh
执行脚本进行安装 (需要 sudo 权限)
sudo sh get-docker.sh
安装完成后,清理脚本文件 (可选)
rm get-docker.sh
“`
这个脚本会自动检测您的发行版,设置仓库,并安装 Docker。
方法三:手动下载 DEB 包安装(不推荐常规使用)
您可以从 Docker 官网手动下载 .deb
格式的安装包,然后使用 dpkg
或 apt
进行安装。这种方法通常用于无法访问互联网或需要安装特定离线版本的场景。过程相对繁琐,且需要手动处理依赖关系,不推荐新手或常规场景使用。
四、 安装后的重要配置
成功安装 Docker 后,通常还需要进行一些配置,以提高使用便利性和安全性。
1. 将用户添加到 docker
用户组(推荐)
默认情况下,docker
命令需要 sudo
权限才能运行,因为 Docker 守护进程绑定到一个 Unix 套接字(/var/run/docker.sock
),该套接字默认由 root
用户拥有,并且只有 docker
组成员才有访问权限。为了避免每次都输入 sudo
,可以将您的当前用户添加到 docker
组。
“`bash
创建 docker 用户组 (如果安装过程中没有自动创建的话)
sudo groupadd docker # 通常安装时会自动创建,可先检查 ‘getent group docker’
将当前用户添加到 docker 组 (将 $USER 替换为您的用户名,通常 $USER 变量即可)
sudo usermod -aG docker $USER
“`
usermod -aG docker $USER
:-a
表示追加(append),-G
指定要加入的组名。这个命令将当前登录用户(由$USER
环境变量表示)添加到docker
组。
重要提示: 将用户添加到组后,您需要退出当前终端会话(或完全注销/重新登录),然后重新打开一个新的终端,这样组员身份的变更才会生效。或者,您可以运行以下命令临时激活组成员身份(仅对当前 shell 有效):
bash
newgrp docker
之后,您就可以直接运行 docker
命令,而无需 sudo
了。例如,再次尝试运行 hello-world
:
bash
docker run hello-world
如果不再需要 sudo
就能成功运行,说明配置生效了。
安全考虑: 虽然方便,但请注意,将用户添加到 docker
组意味着该用户拥有了与 root
用户几乎同等的权限来控制 Docker 守护进程。这意味着他们可以运行能访问宿主机文件系统、甚至提升权限的容器。请确保只将可信用户添加到此组。
2. 配置 Docker 开机自启动
Docker 安装后,通常会默认配置为随系统启动自动运行。您可以使用 systemctl
命令来检查和管理 Docker 服务。
“`bash
检查 Docker 服务状态
sudo systemctl status docker
启动 Docker 服务
sudo systemctl start docker
停止 Docker 服务
sudo systemctl stop docker
重启 Docker 服务
sudo systemctl restart docker
设置 Docker 开机自启动 (通常已默认启用)
sudo systemctl enable docker
禁止 Docker 开机自启动
sudo systemctl disable docker
“`
确保 systemctl status docker
显示服务是 active (running)
状态,并且 Loaded:
行显示 enabled
,表示服务已启用开机自启动。
3. (可选)配置 Docker 数据目录
默认情况下,Docker 的所有数据(镜像、容器、卷等)都存储在 /var/lib/docker
目录下。如果您的根分区空间有限,或者希望将 Docker 数据存放在不同的磁盘或分区,可以修改 Docker 的数据根目录。
这通常通过修改 Docker 守护进程的配置文件 /etc/docker/daemon.json
来实现(如果文件不存在,请创建它)。
“`bash
创建或编辑配置文件
sudo nano /etc/docker/daemon.json
“`
在文件中添加以下内容(将 /path/to/your/docker-data
替换为您希望的新路径):
json
{
"data-root": "/path/to/your/docker-data"
}
保存文件后,需要重启 Docker 服务以使更改生效:
bash
sudo systemctl restart docker
注意: 移动数据目录是一个相对高级的操作。请确保新目录存在且 Docker 守护进程有权访问。如果已有数据,需要先停止 Docker 服务,将旧目录 (/var/lib/docker
) 的内容迁移到新目录,然后再启动服务。务必谨慎操作并备份数据。
五、 Docker 基本使用入门
安装并配置好 Docker 后,让我们尝试一些基本命令,熟悉 Docker 的日常操作。
-
搜索镜像: 从 Docker Hub 搜索可用的镜像。
bash
docker search ubuntu -
拉取镜像: 从 Docker Hub 下载一个镜像到本地。
bash
docker pull nginx:latest # 拉取最新版的 Nginx 镜像 -
查看本地镜像: 列出已下载到本地的所有镜像。
“`bash
docker images或者 docker image ls
“`
-
运行容器: 使用镜像创建并启动一个容器。
“`bash
在后台运行一个 Nginx 容器,并将容器的 80 端口映射到宿主机的 8080 端口
docker run -d -p 8080:80 –name my-nginx nginx
运行一个 Ubuntu 容器,并进入交互式 Shell 环境
docker run -it ubuntu bash
``
-d
*: 后台运行 (detached mode)。
-p host_port:container_port
*: 端口映射。
–name container_name
*: 给容器命名。
-i
*: 保持标准输入打开 (interactive)。
-t`: 分配一个伪终端 (tty)。
* -
查看运行中的容器: 列出当前正在运行的容器。
“`bash
docker ps或者 docker container ls
“`
-
查看所有容器 (包括已停止的):
“`bash
docker ps -a或者 docker container ls -a
“`
-
停止容器:
“`bash
docker stop my-nginx # 使用容器名或者 docker stop
# 使用容器 ID (部分 ID 即可) “`
-
启动已停止的容器:
bash
docker start my-nginx -
重启容器:
bash
docker restart my-nginx -
查看容器日志:
“`bash
docker logs my-nginxdocker logs -f my-nginx # 持续跟踪日志输出
“`
-
进入正在运行的容器:
bash
docker exec -it my-nginx bash # 在运行的 my-nginx 容器中执行 bash 命令 -
删除容器: 容器必须先停止才能删除。
“`bash
docker stop my-nginx
docker rm my-nginx # 删除容器docker rm -f my-nginx # 强制删除运行中的容器(不推荐)
“`
-
删除镜像: 镜像没有被任何容器(包括已停止的)使用时才能删除。
“`bash
docker rmi nginx # 使用镜像名或 IDdocker image rm nginx
docker rmi -f nginx # 强制删除(如果有关联容器,会失败)
“`
-
清理资源: 删除所有已停止的容器、未使用的网络、悬空的镜像和构建缓存。
“`bash
docker system prunedocker system prune -a # 更彻底地清理,包括未使用的镜像(谨慎使用)
“`
这只是 Docker 命令的冰山一角,但足以让您开始使用了。
六、 常见问题与故障排除
在安装和使用 Docker 过程中,可能会遇到一些常见问题:
-
docker: Cannot connect to the Docker daemon. Is the docker daemon running?
- 原因: Docker 守护进程没有运行,或者当前用户没有权限访问 Docker socket。
- 解决:
- 检查服务状态:
sudo systemctl status docker
。如果未运行,启动它:sudo systemctl start docker
。 - 确认用户已添加到
docker
组,并且已重新登录或使用了newgrp docker
。 - 尝试使用
sudo docker ...
看是否是权限问题。
- 检查服务状态:
-
permission denied while trying to connect to the Docker daemon socket...
- 原因: 当前用户没有访问
/var/run/docker.sock
的权限。 - 解决: 按照 “将用户添加到
docker
用户组” 部分操作,并确保重新登录或使用newgrp docker
。
- 原因: 当前用户没有访问
-
安装时 GPG 错误或仓库无法访问:
- 原因: 网络问题、防火墙阻止、GPG 密钥错误或仓库 URL 不正确。
- 解决:
- 检查网络连接和 DNS 设置。
- 确认防火墙没有阻止对
download.docker.com
的访问。 - 仔细检查添加 GPG 密钥和设置仓库的命令是否完全正确复制和执行。
- 尝试重新执行添加密钥和仓库的步骤。
-
端口冲突: 运行容器时提示端口已被占用 (
bind: address already in use
)。- 原因: 您试图映射到宿主机的端口已经被其他进程占用了。
- 解决:
- 使用
sudo ss -tulnp | grep <port_number>
或sudo netstat -tulnp | grep <port_number>
查找占用端口的进程。 - 停止占用端口的服务,或者在
docker run
命令中使用一个不同的宿主机端口。
- 使用
七、 卸载 Docker Engine
如果您需要卸载 Docker Engine,可以按照以下步骤操作:
-
卸载 Docker Engine、CLI、Containerd 和插件包:
bash
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y
sudo apt-get autoremove -y --purge
*purge
命令会移除软件包及其配置文件。
*autoremove --purge
会移除作为依赖安装且不再需要的包及其配置。 -
删除所有 Docker 数据(谨慎操作!):
默认情况下,镜像、容器、卷和自定义配置文件不会被apt-get purge
删除。如果您确定不再需要这些数据,可以手动删除它们。请注意,这将永久删除所有 Docker 数据!bash
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd -
(可选) 删除 Docker 的 APT 仓库和 GPG 密钥:
bash
sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.gpg
sudo apt-get update
完成这些步骤后,Docker Engine 及其相关组件和数据(如果选择删除)将从您的 Ubuntu 系统中完全移除。
八、 总结与后续学习
恭喜您!通过本教程,您应该已经成功在 Ubuntu 系统上安装并初步配置了 Docker Engine。我们详细探讨了使用官方 APT 仓库进行安装的最佳实践,涵盖了必要的先决条件、安装后的用户组配置、服务管理,并提供了一些基本的 Docker 命令示例和故障排除技巧。
掌握 Docker 是现代软件开发和运维的关键技能。现在您已经迈出了第一步,接下来可以探索更广阔的 Docker 世界:
- Dockerfile: 学习如何编写 Dockerfile 来定义和构建您自己的应用程序镜像。
- Docker Compose: 了解如何使用 Docker Compose 来定义和运行多容器 Docker 应用程序。
- Docker Hub / 私有仓库: 学习如何管理和分享您的 Docker 镜像。
- Docker 卷 (Volumes): 深入理解如何在容器中持久化数据。
- Docker 网络 (Networking): 探索容器间的网络连接和通信。
- 容器编排工具: 了解 Kubernetes (k8s) 或 Docker Swarm 等更高级的容器编排平台。
希望这篇详尽的教程对您有所帮助。Docker 的世界广阔而精彩,祝您在容器化的道路上越走越远!