在 Ubuntu 系统上安装 Docker:全面指南
容器化技术已成为现代软件开发和部署的核心组成部分,而 Docker 则是这一领域的领导者。它提供了一种轻量级、可移植、自给自足的方式来打包应用程序及其所有依赖项,使其能够在任何环境中可靠地运行。Ubuntu 作为最流行的 Linux 发行版之一,是许多开发者和企业选择运行 Docker 的首选平台。
本篇文章将提供一个详细的指南,涵盖在 Ubuntu 系统上安装 Docker Engine 的各种方法,重点介绍推荐的官方仓库安装方式,并深入探讨安装后的配置、基本使用、常见问题排查以及一些最佳实践。我们将力求全面,以便您能够完全掌握在 Ubuntu 上部署和管理 Docker 的过程。
文章大纲:
- 引言:Docker 及其在 Ubuntu 上的优势
- 什么是 Docker?
- 为什么选择在 Ubuntu 上运行 Docker?
- Ubuntu 上安装 Docker 的主要方法概述
- 准备工作:安装前的检查
- 系统要求 (Ubuntu 版本、架构)
- 互联网连接
- 具有 sudo 权限的用户账户
- 检查现有 Docker 安装
- 推荐方法:使用 Docker 官方仓库安装 (详细步骤)
- 为什么推荐官方仓库?
- 第 1 步:更新 APT 包索引
- 第 2 步:安装必要的软件包以允许 apt 通过 HTTPS 使用仓库
- 第 3 步:添加 Docker 官方 GPG 密钥
- 第 4 步:添加 Docker 仓库
- 识别您的 Ubuntu 版本
- 添加稳定版仓库
- 可选:添加测试版或夜间版仓库 (不推荐用于生产环境)
- 第 5 步:再次更新 APT 包索引 (在新仓库添加后)
- 第 6 步:安装 Docker Engine、containerd 和 Docker Compose 插件
- 解释
docker-ce
,docker-ce-cli
,containerd.io
,docker-compose-plugin
- 解释
- 第 7 步:验证 Docker Engine 安装
- 运行
hello-world
容器 - 解释
hello-world
容器的作用及输出
- 运行
- 第 8 步:将用户添加到
docker
组 (无需 sudo 运行 Docker 命令)- 解释为什么需要这样做
- 详细的命令步骤
- 强调需要重新登录或重启
- 替代方法 (了解即可)
- 使用便捷安装脚本 (
get.docker.com
)- 优点 (快速)
- 缺点 (不推荐用于生产环境、可控性差、可能安装旧版本)
- 从 Ubuntu 官方仓库安装
- 优点 (简单,通过
apt install docker.io
) - 缺点 (版本通常较旧,可能缺少最新特性和安全更新)
- 优点 (简单,通过
- 使用便捷安装脚本 (
- 安装后配置与基本使用
- 管理 Docker Daemon (启动、停止、重启、状态)
- 再次强调无需 sudo 运行 Docker 命令的重要性
- 配置 Docker 启动时自动运行 (Systemd)
- 常用的 Docker 基本命令演示
docker pull
(拉取镜像)docker images
(列出本地镜像)docker ps
(列出运行中的容器)docker ps -a
(列出所有容器)docker run
(运行容器) – 简单示例docker stop
,docker start
,docker restart
,docker rm
(管理容器生命周期)docker rmi
(删除镜像)
- Docker Compose 简介及基本使用 (使用安装的
docker-compose-plugin
)docker compose up
docker compose down
- 配置 Docker 存储驱动 (简要提及)
- 配置 Docker 网络 (简要提及)
- 故障排除与常见问题
- “Cannot connect to the Docker daemon” 错误
- 检查 Docker 服务状态
- 检查用户权限 (
docker
组) - 检查 Docker 守护进程日志
permission denied
错误 (非 root 用户)- 确认用户已添加到
docker
组并已重新登录
- 确认用户已添加到
- 安装过程中 APT 仓库或 GPG 密钥错误
- 检查命令是否正确
- 检查网络连接
- 磁盘空间不足
docker system prune
命令
- 与其他软件包冲突
- “Cannot connect to the Docker daemon” 错误
- 维护和更新 Docker
- 检查已安装的 Docker 版本
- 使用 APT 更新 Docker
- 安全注意事项
- 运行容器的权限
- 信任的镜像源
- 暴露的端口和卷挂载
- 结论
- 总结官方仓库安装的优势
- 鼓励进一步学习 Docker
正文:
引言:Docker 及其在 Ubuntu 上的优势
什么是 Docker?
在深入安装过程之前,让我们简要回顾一下 Docker。Docker 是一个开源平台,用于自动化部署、扩展和管理应用程序,使用容器技术。与传统的虚拟机(VM)不同,容器共享主机操作系统的内核,但提供了进程隔离、文件系统、网络接口等独立的运行时环境。这使得容器比虚拟机更轻量、启动更快、资源消耗更低。
Docker 提供了一套完整的工具链,包括:
- Docker Engine: 负责构建和运行 Docker 容器的核心守护进程。
- Docker CLI (Command-Line Interface): 与 Docker Daemon 交互的命令行工具。
- Docker Images: 只读模板,用于构建容器,包含了应用程序及其依赖项、配置等。
- Docker Containers: 是镜像的运行实例。
- Docker Hub / Registries: 用于分享和分发 Docker 镜像的仓库服务。
为什么选择在 Ubuntu 上运行 Docker?
Ubuntu 是一个流行且稳定、社区活跃的 Linux 发行版,广泛用于服务器和开发环境。在 Ubuntu 上运行 Docker 具有以下优势:
- 广泛的支持: Docker 官方对 Ubuntu 提供一流的支持,安装、更新和维护都非常顺畅。
- 稳定性与可靠性: Ubuntu LTS(长期支持)版本以其稳定性著称,非常适合生产环境。
- 庞大的社区: 遇到问题时,Ubuntu 和 Docker 都有庞大而活跃的社区,很容易找到解决方案。
- 与云平台的集成: 主流的云服务提供商(如 AWS、Google Cloud、Azure)都提供基于 Ubuntu 的虚拟机或容器服务,与 Docker 集成紧密。
Ubuntu 上安装 Docker 的主要方法概述
在 Ubuntu 上安装 Docker Engine 主要有以下几种方法:
- 使用 Docker 官方仓库: 这是官方推荐且最常用、最可靠的方法。通过添加 Docker 官方的 APT 仓库,您可以轻松安装最新版本的 Docker Engine、containerd 和 Docker Compose 插件,并能方便地进行更新。
- 使用便捷安装脚本: Docker 提供了一个脚本,可以快速安装 Docker。但这主要用于开发或测试环境,不推荐用于生产环境,因为它缺乏可控性。
- 从 Ubuntu 官方仓库安装: Ubuntu 的官方仓库中也包含了 Docker 包(通常命名为
docker.io
和docker-compose
)。但这通常不是最新版本,可能滞后于官方发布几个月甚至更久,因此不推荐除非您有特定的兼容性需求。
在本文中,我们将重点详细介绍和推荐第一种方法:使用 Docker 官方仓库进行安装。
准备工作:安装前的检查
在开始安装 Docker 之前,请确保您的 Ubuntu 系统满足以下基本要求:
- 系统要求:
- 支持的 Ubuntu 版本:Docker Engine 支持以下 Ubuntu 版本的
amd64
/x86_64
、armhf
、arm64
和s390x
架构:- Ubuntu Lunar (23.04)
- Ubuntu Kinetic (22.10)
- Ubuntu Jammy (22.04 LTS)
- Ubuntu Focal (20.04 LTS)
- Ubuntu Bionic (18.04 LTS) – 注意: 18.04 LTS 可能即将或已经停止接受新的 Docker Engine 版本更新,官方建议升级到更高版本的 LTS。
- 建议使用 LTS(长期支持)版本,例如 22.04 LTS 或 20.04 LTS,因为它们提供更长的支持周期和更好的稳定性。
- 支持的 Ubuntu 版本:Docker Engine 支持以下 Ubuntu 版本的
- 互联网连接: 安装过程需要从互联网下载软件包。
- 具有 sudo 权限的用户账户: 您需要一个非 root 用户,但该用户必须能够使用
sudo
命令来执行需要管理员权限的操作。 - 检查现有 Docker 安装: 如果您之前安装过 Docker(无论是通过 Snap、Ubuntu 仓库还是其他方式),建议先卸载它们,以避免冲突。可以使用以下命令卸载旧版本:
bash
sudo apt-get remove docker docker-engine docker.io containerd runc
这条命令不会删除/var/lib/docker/
中的镜像、容器、卷和网络配置文件。如果您想彻底清除所有 Docker 相关的数据,可以在卸载软件包后手动删除/var/lib/docker/
目录,但这将永久删除所有 Docker 数据,请谨慎操作。
满足上述条件后,我们就可以开始安装 Docker 了。
推荐方法:使用 Docker 官方仓库安装 (详细步骤)
使用 Docker 官方仓库是安装 Docker Engine 的首选方法,它能确保您获得最新、最稳定的版本,并且方便后续的更新。以下是详细的步骤:
为什么推荐官方仓库?
- 最新版本: 您可以安装 Docker 官方最新发布的稳定版,获得最新的功能、性能优化和安全更新。
- 及时更新: 通过标准的 APT 包管理器,您可以方便地检查和安装 Docker 的新版本。
- 包含所有组件: 官方仓库不仅提供 Docker Engine (
docker-ce
),还包含推荐的低层运行时 (containerd.io
) 和官方的 Docker Compose 插件 (docker-compose-plugin
)。 - 一致性: 这是官方推荐的安装方式,与其他操作系统上的官方安装方式保持一致。
现在,开始安装步骤:
第 1 步:更新 APT 包索引
在安装新软件或添加新仓库之前,始终建议更新系统的 APT 包索引。这会从配置的源中获取最新的软件包列表信息。
bash
sudo apt-get update
执行此命令后,系统会连接到 Ubuntu 的软件源服务器,下载最新的软件包列表。
第 2 步:安装必要的软件包以允许 apt 通过 HTTPS 使用仓库
APT 需要一些辅助软件包才能安全地通过 HTTPS 协议访问仓库。这些软件包通常在现代 Ubuntu 系统上已经预装,但安装它们可以确保所有依赖项都已满足。
bash
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
ca-certificates
: 允许系统使用 SSL/TLS 证书来验证安全连接。curl
: 一个用于传输数据的命令行工具,这里用于下载 Docker 官方的 GPG 密钥。gnupg
: GNU Privacy Guard,用于管理密钥,这里用于验证 Docker 仓库的 GPG 密钥。lsb-release
: 用于识别 Ubuntu 发行版的信息,这对于正确配置 Docker 仓库路径很有用。
输入 Y
并按 Enter 确认安装这些软件包。
第 3 步:添加 Docker 官方 GPG 密钥
为了验证您下载的 Docker 软件包是官方发布的且未被篡改,需要添加 Docker 官方的 GPG(GNU Privacy Guard)公钥。APT 包管理器会使用此密钥来验证软件包的数字签名。
首先,创建一个目录来存储 GPG 密钥:
bash
sudo mkdir -p /etc/apt/keyrings
然后,使用 curl
下载密钥,并将其通过管道传输给 gpg
命令进行解压和处理,最后将处理后的密钥保存到 /etc/apt/keyrings/docker.gpg
文件中。dearmor
命令用于将 ASCII 格式的密钥转换为二进制格式,这是 APT 所需的格式。
bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
curl -fsSL
:-f
: 在服务器返回错误时静默失败。-s
: 静默模式,不显示进度或错误消息。-S
: 与-s
结合使用时,如果 curl 失败,仍会显示错误消息。-L
: 如果 URL 发生重定向,curl 会跟随重定向。
|
: 管道,将 curl 的输出作为 gpg 命令的输入。sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
: 使用 sudo 权限运行 gpg,--dearmor
解压密钥,-o
指定输出文件为/etc/apt/keyrings/docker.gpg
。
执行此命令后,您的系统就信任了 Docker 官方仓库的签名。
第 4 步:添加 Docker 仓库
现在,我们需要告诉 APT 包管理器 Docker 仓库的位置。我们将添加稳定版(stable)仓库。
首先,使用 lsb_release -cs
命令获取您的 Ubuntu 版本代号(例如 focal
代表 Ubuntu 20.04,jammy
代表 Ubuntu 22.04)。
然后,使用 echo
命令将仓库信息写入 /etc/apt/sources.list.d/docker.list
文件。
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 [...] https://... ubuntu $(lsb_release -cs) stable
: 这是 APT 仓库配置的格式:deb
: 表示这是一个二进制包仓库。[arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg]
: 指定只下载与当前系统架构匹配的包,并使用/etc/apt/keyrings/docker.gpg
中的密钥进行签名验证。$(dpkg --print-architecture)
会自动检测系统架构(如amd64
)。https://download.docker.com/linux/ubuntu
: 这是 Docker 仓库的基本 URL。$(lsb_release -cs)
: 插入您的 Ubuntu 版本代号,确保 APT 查找针对您特定版本的 Docker 包。stable
: 指定使用stable
频道。您也可以替换为test
或nightly
,但这不推荐用于生产环境。
| sudo tee /etc/apt/sources.list.d/docker.list
: 将 echo 的输出通过管道传输给tee
命令,并使用sudo
权限将其写入/etc/apt/sources.list.d/docker.list
文件。tee
命令会将输入同时输出到标准输出和指定文件。> /dev/null
: 将 tee 输出到标准输出的部分重定向到/dev/null
,以避免在终端上看到仓库配置字符串。
执行此命令后,您的系统就配置好了 Docker 的官方稳定版仓库。
第 5 步:再次更新 APT 包索引 (在新仓库添加后)
添加了新的仓库后,必须再次更新 APT 包索引,以便 APT 能够识别并能从新的 Docker 仓库中找到可用的软件包列表。
bash
sudo apt-get update
第 6 步:安装 Docker Engine、containerd 和 Docker Compose 插件
现在,您可以使用 apt-get install
命令来安装 Docker 的核心组件了。
bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
docker-ce
: 这是 Docker Engine 的社区版(Community Edition)。它是 Docker 的核心组件,包含守护进程(dockerd)、REST API 以及与容器和镜像交互的高级 CLI 工具。docker-ce-cli
: 这是 Docker 的命令行客户端工具。它允许您与本地或远程的 Docker Daemon 进行交互。即使不安装docker-ce
,单独安装docker-ce-cli
也可以用于连接到远程 Docker 主机。containerd.io
: 这是一个行业标准的容器运行时,负责管理容器的生命周期(创建、启动、停止等)。Docker Engine 使用 containerd 作为其低层运行时。docker-compose-plugin
: 这是 Docker Compose 的新实现,作为 Docker CLI 的插件提供。Docker Compose 用于定义和运行多容器应用程序。
APT 会计算依赖关系并列出将要安装的软件包及其版本。仔细检查信息,确保您正在安装来自 download.docker.com
源的软件包。输入 Y
并按 Enter 确认安装。
安装完成后,Docker Engine 会自动启动。您可以使用以下命令检查其状态:
bash
sudo systemctl status docker
输出应该显示 active (running)
,表示 Docker 服务正在运行。
第 7 步:验证 Docker Engine 安装
验证安装的最简单方法是运行官方提供的 hello-world
容器。这是一个非常小的镜像,它会运行一个简单的容器,打印一条消息,然后退出。
bash
sudo docker run hello-world
第一次运行此命令时,Docker CLI 会:
- 检查本地是否有
hello-world
镜像。 - 如果本地没有,会从 Docker Hub(默认的镜像仓库)下载 (
pull
)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.
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.
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
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
“`
这证明 Docker Engine 已经成功安装并能够正常运行容器了。
第 8 步:将用户添加到 docker
组 (无需 sudo 运行 Docker 命令)
默认情况下,运行 docker
命令需要使用 sudo
。这是因为 Docker Daemon 守护进程以 root 权限运行,而与守护进程通信的 Unix 套接字 /var/run/docker.sock
的所有者是 root
,且只有 root
用户和 docker
组成员有权限访问。
每次都使用 sudo
来运行 Docker 命令非常麻烦,而且可能存在一定的安全风险(尽管运行 Docker 容器本身也涉及特权)。为了方便,官方推荐将需要运行 Docker 命令的用户添加到 docker
用户组中。
重要提示: docker
组授予用户与 Docker Daemon 交互的权限,这相当于授予用户 root 权限,因为容器可以被配置为以特权模式运行、挂载主机文件系统等。因此,请谨慎将用户添加到此组。
将当前用户添加到 docker
组:
bash
sudo usermod -aG docker $USER
sudo usermod
: 用于修改用户账户的命令。-aG docker
:-a
表示 append(追加),-G
表示 group。这个选项会将指定的用户添加到docker
组,同时保留该用户已有的其他组。$USER
: 这是一个环境变量,代表当前登录的用户名。
应用组成员关系:
将用户添加到组后,更改不会立即生效。您需要:
- 注销并重新登录。 这是最可靠的方法,可以确保新的组成员关系被正确加载。
- 或者,重新启动系统。 这也能达到同样的效果。
- 或者(有时可用但不完全可靠),在当前会话中启动一个新的 shell 会话。 可以尝试运行
newgrp docker
。但这种方法可能不适用于所有情况或所有命令,推荐前两种方法。
验证无需 sudo 运行:
重新登录或重启后,打开一个新的终端窗口,尝试不使用 sudo
运行 docker
命令:
bash
docker run hello-world
如果看到与之前相同的 hello-world
输出,说明您已经成功地无需 sudo
即可运行 Docker 命令了。如果仍然出现 permission denied
错误,请仔细检查您是否已添加到 docker
组,并且已完全注销并重新登录。
至此,您已经在 Ubuntu 系统上通过官方推荐的方式成功安装并配置好了 Docker Engine。
替代方法 (了解即可)
虽然官方仓库安装是首选,但了解其他方法也很有用。
使用便捷安装脚本 (get.docker.com
)
Docker 提供了一个脚本,可以快速安装 Docker。这个脚本会自动检测您的系统并配置仓库然后安装 Docker。
bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
- 优点: 快速,只需一行或两行命令即可完成安装。
- 缺点:
- 安全性较低: 直接通过
curl ... | sudo sh
这种方式(虽然上面拆分成了下载和执行两步,但核心理念是相似的)来执行从互联网下载的脚本存在风险。尽管 Docker 官方脚本通常是安全的,但这并不是一个推荐的通用实践。 - 可控性差: 您无法像使用 APT 那样清晰地知道将要安装的具体版本,或者选择特定频道(如 test 或 nightly)。
- 难于更新: 更新通常需要再次运行脚本或通过 APT,这不如直接使用 APT 仓库管理方便。
- 不推荐用于生产环境: Docker 官方明确指出,这个脚本不适合生产环境使用。
- 安全性较低: 直接通过
因此,这个方法更适合在虚拟机中进行快速测试或在非关键的开发环境中使用。
从 Ubuntu 官方仓库安装
Ubuntu 的官方仓库中也包含 Docker 相关的软件包,例如 docker.io
和 docker-compose
。
bash
sudo apt update
sudo apt install docker.io docker-compose
docker.io
: Ubuntu 官方仓库中的 Docker Engine 包名。-
docker-compose
: Ubuntu 官方仓库中的 Docker Compose 包名(这是旧的、基于 Python 的 Docker Compose 版本,而不是上面提到的docker-compose-plugin
)。 -
优点: 安装过程简单,完全通过 Ubuntu 的包管理器进行。
- 缺点:
- 版本过旧: 这是最主要的缺点。Ubuntu 官方仓库中的 Docker 版本通常显著滞后于 Docker 官方发布的新版本,可能缺少最新的特性、性能改进和安全修复。对于需要最新功能或依赖于特定 Docker 版本的应用程序来说,这是一个大问题。
- 组件不同: 安装的是
docker.io
而不是docker-ce
,虽然功能类似,但版本管理和某些细节可能不同。安装的是旧版的docker-compose
而不是推荐的docker-compose-plugin
。
除非您因为特定的原因(例如需要与某个旧版本的 Ubuntu 发行版保持严格兼容)而不得不使用这个方法,否则强烈建议使用 Docker 官方仓库进行安装。
安装后配置与基本使用
安装 Docker Engine 后,还需要了解一些基本的配置和使用方法。
管理 Docker Daemon (启动、停止、重启、状态)
Docker Daemon 是一个系统服务,通常由 systemd 管理。您可以使用 systemctl
命令来管理它:
- 检查 Docker 服务的状态:
bash
systemctl status docker
这将显示服务是否正在运行、其进程 ID、负载情况以及最近的日志条目。 - 启动 Docker 服务:
bash
sudo systemctl start docker - 停止 Docker 服务:
bash
sudo systemctl stop docker - 重启 Docker 服务:
bash
sudo systemctl restart docker - 重新加载 Docker 服务的配置文件(如果修改了
/etc/docker/daemon.json
等):
bash
sudo systemctl reload docker
再次强调无需 sudo 运行 Docker 命令的重要性
如前所述,为了避免每次运行 docker
命令都输入 sudo
,并且提高使用便利性,请确保您的用户已经添加到 docker
组,并且您已经重新登录或重启了系统。
配置 Docker 启动时自动运行 (Systemd)
通过官方仓库安装的 Docker Engine 通常会自动配置为在系统启动时运行。您可以使用以下命令检查或启用此设置:
- 检查是否已启用自动启动:
bash
systemctl is-enabled docker
如果输出enabled
,则已配置为自动启动。 - 启用 Docker 自动启动:
bash
sudo systemctl enable docker
这将创建必要的 systemd 符号链接,使 Docker 在下次启动时自动运行。 - 禁用 Docker 自动启动:
bash
sudo systemctl disable docker
常用的 Docker 基本命令演示
一旦 Docker 安装并运行正常,您就可以开始使用它了。以下是一些最常用的基本命令:
- 拉取镜像 (
docker pull
)
从 Docker Hub 或其他仓库下载镜像到本地。
bash
docker pull ubuntu:latest
docker pull nginx - 列出本地镜像 (
docker images
)
查看所有下载或构建的本地镜像。
bash
docker images
输出类似:
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest <image_id> X weeks ago YY MB
nginx latest <image_id> X days ago ZZ MB
hello-world latest <image_id> X months ago KK kB - 列出运行中的容器 (
docker ps
)
查看当前正在运行的容器。
bash
docker ps - 列出所有容器 (包括已停止的) (
docker ps -a
)
查看所有容器,无论其状态如何(运行中、已停止、已退出)。
bash
docker ps -a -
运行容器 (
docker run
)
这是最核心的命令,用于基于镜像创建并运行一个新的容器。
“`bash
# 在前台运行一个 ubuntu 容器并执行 bash 命令(通常用于调试)
docker run -it ubuntu bash在后台运行一个 nginx web 服务器容器,并将主机的 80 端口映射到容器的 80 端口
docker run -d -p 80:80 nginx
* `-it`: 分配一个伪终端 (`-t`) 并保持标准输入打开 (`-i`),通常用于交互式容器。
bash
* `-d`: 在后台 (`detached` mode) 运行容器。
* `-p 80:80`: 将主机的 80 端口 (`host_port`) 映射到容器的 80 端口 (`container_port`)。
* **停止、启动、重启容器 (`docker stop`, `docker start`, `docker restart`)**
根据容器 ID 或名称管理容器的运行状态。
docker stop
docker start
docker restart
容器 ID 可以通过 `docker ps -a` 获取。您也可以给容器指定一个名称 (`--name <name>`) 在运行它时。
bash
* **删除容器 (`docker rm`)**
删除一个已停止的容器。
docker rm
要删除运行中的容器,可以使用 `-f` 选项(强制删除),但这不推荐。
bash
* **删除镜像 (`docker rmi`)**
删除本地的一个或多个镜像。
docker rmi
“`
请注意,如果某个镜像正在被容器使用,您需要先删除或停止并删除使用该镜像的容器。
Docker Compose 简介及基本使用 (使用安装的 docker-compose-plugin
)
Docker Compose 允许您使用 YAML 文件来定义和管理多容器应用程序。通过官方仓库安装 Docker Engine 时,您也安装了 docker-compose-plugin
。这意味着您现在可以使用 docker compose
命令(注意:不是旧版的 docker-compose
命令)来替代旧版。
要使用 Docker Compose,您需要在项目根目录创建一个名为 docker-compose.yml
的文件,例如:
yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
app:
image: my_custom_app_image
depends_on:
- web
# ... 其他配置
然后,在包含 docker-compose.yml
文件的目录中,您可以使用以下命令:
- 构建、创建并启动服务:
bash
docker compose up -d
-d
选项使其在后台运行。 - 停止并移除服务及其网络等:
bash
docker compose down
Docker Compose 是管理复杂应用程序的强大工具,强烈建议进一步学习。
配置 Docker 存储驱动 (简要提及)
Docker 使用存储驱动来管理镜像和容器层。不同的存储驱动(如 OverlayFS、devicemapper、AUFS 等)对性能、存储空间和兼容性有不同的影响。在大多数现代 Ubuntu 版本上,OverlayFS 是默认且推荐的驱动。您通常不需要手动配置它,除非遇到特定问题或有特殊需求。可以通过修改 /etc/docker/daemon.json
文件来配置存储驱动,然后重启 Docker 服务。
配置 Docker 网络 (简要提及)
Docker 提供了多种网络驱动,允许容器之间以及容器与外部世界进行通信。默认的网络模式通常足以满足基本需求。对于更复杂的场景(如创建自定义网络、容器间隔离或连接到现有网络),您可以进一步配置 Docker 网络。这也通常通过命令或 /etc/docker/daemon.json
进行。网络是 Docker 中一个相对独立的复杂主题,需要专门的学习。
故障排除与常见问题
在安装或使用 Docker 过程中,可能会遇到一些问题。以下是一些常见问题及其解决方案:
“Cannot connect to the Docker daemon” 错误
这是最常见的错误之一,意味着 Docker CLI 无法与 Docker Daemon 建立连接。可能的原因包括:
- Docker 服务未运行:
使用systemctl status docker
检查 Docker 服务状态。如果未运行,尝试sudo systemctl start docker
。 - 用户没有访问 Docker 套接字的权限:
Docker Daemon 的默认 Unix 套接字是/var/run/docker.sock
,通常只有root
用户和docker
组成员有权限访问。如果您使用非 root 用户运行 Docker 命令且没有添加到docker
组,就会出现此错误。解决方法是将用户添加到docker
组 (sudo usermod -aG docker $USER
) 并重新登录。 - Docker 套接字位置错误:
检查/etc/docker/daemon.json
文件中是否配置了非默认的hosts
设置,可能导致 CLI 无法找到套接字。 - 防火墙问题:
如果您配置了防火墙(如 UFW),确保它没有阻止对 Docker Daemon 通信所需的端口或套接字的访问。 - Docker 守护进程崩溃:
检查 Docker 守护进程的日志 (sudo journalctl -u docker.service
) 以查找详细错误信息。
permission denied
错误 (非 root 用户)
当您尝试在没有 sudo
的情况下运行 docker
命令,但您的用户不在 docker
组中时,就会出现此错误。
- 解决方案: 确保您的用户已添加到
docker
组 (sudo usermod -aG docker $USER
) 并已完全注销并重新登录。仅仅关闭并重新打开终端是不够的。
安装过程中 APT 仓库或 GPG 密钥错误
如果在执行 apt update
或 apt install
时遇到与 Docker 仓库相关的错误(如无法找到包、签名验证失败):
- 检查仓库文件: 确认
/etc/apt/sources.list.d/docker.list
文件内容正确,特别是 Ubuntu 版本代号 ($(lsb_release -cs)
) 和仓库 URL。 - 检查 GPG 密钥: 确认
/etc/apt/keyrings/docker.gpg
文件存在,并且您已经使用正确的命令添加了密钥。有时网络问题可能导致密钥下载不完整。可以尝试重新执行密钥下载命令。 - 检查网络连接: 确保您的服务器可以访问
download.docker.com
。 - 检查文件权限: 确保 APT 相关文件(如
/etc/apt/sources.list.d/docker.list
和/etc/apt/keyrings/docker.gpg
)具有正确的读取权限。
磁盘空间不足
Docker 镜像和容器会占用大量磁盘空间,特别是在拉取或构建许多大型镜像后。如果磁盘空间不足,可能导致安装失败或容器无法正常运行。
- 检查磁盘空间: 使用
df -h
命令检查根分区的使用情况。 - 清理 Docker 资源: 使用
docker system prune
命令可以清理停止的容器、未使用的网络、悬空的镜像和构建缓存。使用-a
选项可以移除更多资源,但请注意这会删除所有停止的容器和 所有 未使用的镜像(不仅仅是悬空的)。
bash
docker system prune
# 或者更彻底地清理(谨慎使用)
docker system prune -a
与其他软件包冲突
极少数情况下,Docker 可能与系统中已安装的其他软件发生冲突,特别是其他容器运行时或虚拟化软件。
- 检查日志: 仔细检查 Docker 服务或 APT 安装过程的错误日志,看是否有关于冲突的明确信息。
- 卸载冲突软件: 如果确定存在冲突,可能需要卸载冲突的软件包。
维护和更新 Docker
通过官方仓库安装 Docker 的一个主要优势是易于更新。
检查已安装的 Docker 版本
您可以使用以下命令检查已安装的 Docker 版本:
bash
docker version
这将显示 Docker Client 和 Docker Engine (Daemon) 的详细版本信息。
使用 APT 更新 Docker
当 Docker 发布新版本时,您可以通过标准的 APT 包管理器进行更新:
bash
sudo apt update
sudo apt upgrade docker-ce docker-ce-cli containerd.io docker-compose-plugin
apt upgrade
命令会检查所有已安装软件包是否有新版本,并安装它们(包括 Docker 组件)。在更新 Docker Engine 时,服务可能会被临时停止和重启。
安全注意事项
使用 Docker 容器提供了隔离性,但了解相关的安全风险仍然重要:
- 运行容器的权限: 尽管容器提供了隔离,但默认情况下,容器内的进程以 root 权限运行。如果容器内的进程被攻破,可能会对主机系统构成风险。尽可能在容器内以非 root 用户身份运行应用程序(通过在 Dockerfile 中使用
USER
指令)。 - 信任的镜像源: 仅从可信的来源(如 Docker Hub 的官方镜像、经验证的供应商镜像或您自己构建的镜像)拉取和运行镜像。未经验证的镜像可能包含恶意软件或配置漏洞。
- 暴露的端口和卷挂载: 小心映射主机端口到容器端口,特别是将容器的服务暴露到公共网络时。同样,谨慎使用卷挂载,尤其是挂载敏感的主机目录,因为容器对挂载的卷拥有完整的读写权限。
docker
组的权限: 如前所述,将用户添加到docker
组实际上是授予了该用户与 root 几乎等同的权限。确保只将您信任的用户添加到此组。
结论
本篇文章详细介绍了在 Ubuntu 系统上安装 Docker Engine 的推荐方法——使用 Docker 官方仓库。这种方法确保您获得最新版本、方便更新,并包含了 Docker 的核心组件以及 Docker Compose 插件。我们逐步讲解了添加 GPG 密钥、配置仓库、安装软件包、验证安装以及最重要的——配置非 root 用户运行 Docker 命令的步骤。
我们还简要介绍了使用便捷脚本和 Ubuntu 官方仓库的替代方法,并解释了为什么它们通常不如官方仓库安装推荐。最后,我们探讨了安装后的基本使用、管理 Docker 服务、常见的故障排除技巧以及重要的安全注意事项。
现在,您应该已经成功地在您的 Ubuntu 系统上安装了 Docker,并具备了开始使用容器化技术的基础知识。Docker 是一个功能强大的工具,它的学习曲线可能有些陡峭,但投入的时间将是值得的。建议您继续探索 Docker 文档,学习如何构建自己的镜像(Dockerfile)、使用 Docker Compose 管理多容器应用、了解更高级的网络和存储配置,以及如何在生产环境中部署和管理 Docker。容器化的世界充满机遇,祝您在 Docker 之路上一切顺利!