跳到主要内容Ubuntu 24.04 服务器版 Docker 安装指南 | 极客日志Shell / Bash
Ubuntu 24.04 服务器版 Docker 安装指南
在 Ubuntu 24.04 服务器版上安装 Docker Engine 的完整流程。内容包括环境准备、通过官方源添加 GPG 密钥和软件源、安装 Docker 核心组件及插件、配置国内镜像源以解决拉取慢的问题,以及将当前用户加入 docker 组以实现免 sudo 执行命令。通过验证安装结果和测试 hello-world 镜像,确认 Docker 环境搭建成功。
路由之心27 浏览 一、环境说明
- 虚拟机:VMware Workstation Pro 17
- 系统:Ubuntu 24.04.2 服务器版
- SSH 工具:FinalShell 4.5.12
当前系统状态为刚完成安装,进行一些基础配置。当前登录用户为普通用户,因此所有命令都需要添加 sudo 命令来临时获得 root 权限。建议对当前系统环境拍摄快照,以便后期恢复。
官方安装文档:在 Ubuntu 上安装 Docker Engine
二、安装 Docker
2.1 验证当前系统是否安装 Docker
docker -v
可以看到当前系统并没有安装 Docker 引擎,同时系统给出了安装语句,但我们通常建议使用 Docker 官方源安装最新版本,而不是使用 Ubuntu 自带的 docker.io(可能较旧)。
2.2 更新软件包索引
sudo apt update
在安装软件前推荐先执行此命令,用于刷新本地的软件包索引,这样可以确保后续安装或升级时获取的是最新版本信息。
2.3 安装依赖包
sudo apt install -y ca-certificates curl
ca-certificates:允许系统信任 HTTPS 证书,用于安全地访问网络源。
curl:命令行工具,用于从网络下载文件(如 Docker 的 GPG 密钥)。
2.4 创建用于存储 GPG 密钥的目录
sudo install -m 0755 -d /etc/apt/keyrings
install:一个用于复制文件和创建目录的命令,比 mkdir 和 chmod 的组合更简洁。
-m 0755:设置目录的权限为 0755(所有者可读、写、执行,其他用户可读和执行)。这是存储密钥目录的标准权限。
-d:指定要创建的是目录而不是文件。
/etc/apt/keyrings:APT 包管理器推荐的用于存储第三方软件仓库密钥的目录。
2.5 下载 GPG 密钥
下载 Docker 官方的 GPG 密钥,并将其保存到上一步创建的目录中。
GPG 密钥用于验证 Docker 软件包的'身份'和'完整性',确保你下载的 Docker 软件包来自可信的源头,并且在传输过程中没有被任何人篡改或植入恶意代码。
此处地址为官方地址的阿里云镜像地址,Docker 官方地址为:https://download.docker.com/linux/ubuntu。
sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
-f 或 --fail:让 curl 在服务器错误时静默失败(不输出 HTML 错误页面)。
-s 或 --silent:静默模式,不显示进度条或错误信息。-S 或 --show-error:与 -s 一起使用时,如果失败会显示错误信息。-L 或 --location:如果请求的页面发生了重定向,则自动跟随重定向。-o /etc/apt/keyrings/docker.asc:将下载的内容输出到指定文件。文件扩展名 .asc 表明这是一个 ASCII 格式的 GPG 密钥。2.6 更改密钥文件的权限
为所有用户添加可读的权限,这样所有用户下载时都可以通过密钥进行验证。
sudo chmod a+r /etc/apt/keyrings/docker.asc
chmod a+r:a 代表所有用户 (all),+r 代表添加读取 (read) 权限。
2.7 添加 Docker 的软件源
将 Docker 的官方软件源添加到 Ubuntu 24.04 的软件源列表,apt install 时用于获取官方源提供 Docker CE 的所有组件:docker-ce, docker-ce-cli, containerd.io, docker-buildx-plugin, docker-compose-plugin 等。
即告诉 Ubuntu 系统,以后获取 Docker 软件包不要从 Ubuntu 自己的仓库找,而要从 Docker 官方的这个特定地址获取,并且使用指定的 GPG 密钥来验证这些软件包的真伪。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "deb [arch=...] ..."
- 用于生成一个标准的 Debian/Ubuntu 软件源条目(sources.list entry)。
[arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
arch=$(dpkg --print-architecture):这是一个命令替换。它会先执行 dpkg --print-architecture 命令(该命令会输出您系统的架构,如 amd64 或 arm64),然后用输出结果替换这部分内容。这确保了软件源地址与您的系统架构匹配。
signed-by=/etc/apt/keyrings/docker.asc:极其重要。它明确指定了用于验证此软件源中所有软件包的 GPG 密钥的路径。这是确保软件包来自 Docker 官方而非恶意镜像的安全关键步骤。
http://mirrors.aliyun.com/docker-ce/linux/ubuntu
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
- 这是另一个命令替换和参数扩展的巧妙结合。
. /etc/os-release:这会执行(source)一个系统文件,该文件包含当前 Ubuntu 版本的详细信息(如 VERSION_ID="24.04", VERSION_CODENAME=noble, UBUNTU_CODENAME=noble)。
&& echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}":如果前一个命令成功,则执行 echo。${UBUNTU_CODENAME:-$VERSION_CODENAME} 是一个参数扩展,意思是'如果 UBUNTU_CODENAME 变量存在且不为空,则使用它的值;否则,使用 VERSION_CODENAME 的值'。
- 最终,这部分会被替换为您的 Ubuntu 系统代号,例如
jammy (22.04), noble (24.04) 等。这确保了您添加的软件源与您的系统版本完全匹配。
stable
- 指定要使用 Docker 的稳定版(stable)发布通道。而不是测试版(test)或夜间构建版(nightly)。
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|:管道符,将 echo 命令的输出传递给 tee 命令。
tee:一个同时输出到屏幕和文件的命令。这里与 sudo 一起使用,以便拥有向受保护目录写入的权限。
/etc/apt/sources.list.d/docker.list:将软件源条目写入到 /etc/apt/sources.list.d/ 目录下的一个新文件 docker.list 中。这是一种最佳实践,可以保持组织有序,并且更容易管理和删除单个软件的源。
> /dev/null:将 tee 命令输出到标准输出(屏幕) 的内容重定向到'空设备',从而抑制任何输出,保持终端整洁。
2.8 更新软件包索引
在添加了新的软件源(Docker 源)之后,必须再次运行 apt update,这样 APT 才会知道这个新源的存在,并从中获取可用软件包的列表。如果不执行这一步,系统将找不到 Docker 软件包。
2.9 安装 Docker
安装最新版本的 Docker,包括 Docker 引擎及其相关组件。
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
docker-ce
- 全称:Docker Community Edition
- 作用:这是 Docker 引擎的核心,也就是常说的 'Docker 守护进程' (
dockerd)。
- 功能:它是一个持续运行的后台服务,负责管理 Docker 的方方面面:
- 下载和存储镜像(Images)。
- 创建、运行、停止和删除容器(Containers)。
- 管理网络(Networks)和存储卷(Volumes)。
- 暴露 REST API 供其他工具(如 CLI)调用。
- 简言之:它是 Docker 的'大脑'和'发动机'。
docker-ce-cli
- 全称:Docker Community Edition Command Line Interface
- 作用:这是 Docker 的命令行工具。你平时在终端里打的
docker 命令就来自于它。
- 功能:它本身不执行管理操作,而是作为一个客户端,接收你的命令(如
docker run, docker ps),然后通过 API 与上面的 docker-ce 守护进程通信,并告诉你结果。
- 简言之:它是用户与 Docker 引擎交互的'遥控器'。
containerd.io
- 作用:这是一个行业标准的容器运行时。它是更底层、更核心的组件。
- 功能:它负责容器生命周期的最底层操作,例如:
- 从镜像中拉取和存储容器文件系统层。
- 管理容器的执行、暂停、恢复和销毁。
- 管理容器网络和存储的低级细节。
- 与 Docker 的关系:从 Docker 的架构演变来看,
docker-ce(守护进程)现在将大部分实际的容器运行时操作委托给了 containerd。这种解耦使得架构更清晰,containerd 也可以被其他系统(如 Kubernetes)直接使用。
- 简言之:它是真正'动手'拉取镜像和运行容器的'工程师',而
docker-ce 是它的'项目经理'。
docker-buildx-plugin
- 作用:Docker 的扩展构建插件,提供了下一代强大的镜像构建功能。
- 功能:它是
docker build 命令的增强版,支持许多高级特性:
- 多平台构建:一次性为多种 CPU 架构(如 amd64, arm64, arm/v7)构建镜像,无需复杂的交叉编译环境。
- 构建缓存管理:更高效的缓存机制,加速构建过程。
- 并行构建:同时处理多个构建任务,充分利用多核 CPU。
- 注意:在较新版本的 Docker 中,
buildx 已成为默认的构建引擎。
docker-compose-plugin
- 作用:Docker 官方提供的 Compose 功能,用于定义和运行多容器应用。
- 功能:它提供了
docker compose 命令(注意没有横线),用来替代旧的、独立的 docker-compose(Python 编写)工具。
- 通过一个
docker-compose.yml 文件来配置你的应用所需的所有服务、网络、卷。
- 用一个命令(
docker compose up)就能启动整个复杂的应用栈(例如一个包含 Web 前端、后端 API、数据库、缓存的应用)。
- 为什么是插件形式:Docker 公司为了更好的集成和发布周期,将 Compose 功能做成了 CLI 插件,而不是一个独立的二进制文件。
发送指令调度容器操作真正运行容器解析 yml 文件处理构建请求用户 docker-ce-cli
CLI 命令行 docker-ce
守护进程 containerd.io
容器运行时 Linux Kernel
系统内核 docker-compose-plugindocker-buildx-plugin
2.10 验证安装是否成功
2.11 开机自启
执行 systemctl is-enabled docker 命令,可以看到输出是 enabled,说明 Docker 已经设置为开机自动启动了
三、替换国内镜像源
3.1 拉取镜像失败
现在已经安装好 Docker 了,但还不能完全使用。
当前拉取镜像时,是从 Docker Hub 中拉取的。但国内访问 Docker Hub 时,会无法访问,导致无法拉取镜像。
但请放心,国内镜像源本质上是为了提升访问速度而建立的 Docker Hub 缓存代理。它会帮你从 Docker Hub 拉取镜像,并将这些镜像存储在自己的服务器上。你通过它们下载的镜像,源头依然是 Docker Hub。你可以把它们理解为设立在身边的 Docker Hub'分身',旨在解决远距离访问速度慢的问题。
镜像加速器 - Docker Hub 的缓存代理是否检查镜像是否已缓存?直接从缓存返回镜像向 Docker Hub 发起请求缓存镜像到本地返回镜像给用户用户发起 docker pull 请求
例如:docker pull nginx 请求被拦截并转发用户获得镜像 Docker Hub
hub.docker.com
3.2 打开配置文件
当前 Docker 28.4.0 版本中,并没有存在配置文件,因此需要创建并打开。
sudo vim /etc/docker/daemon.json
3.3 添加镜像源
| 镜像源名称 | 镜像加速地址 | 主要特点/备注 |
|---|
| DaoCloud 镜像站 | https://docker.m.daocloud.io | 国内老牌服务商,稳定可靠 |
| 网易云镜像加速 | http://hub-mirror.c.163.com | 多节点覆盖 |
| 中国科学技术大学 | https://docker.mirrors.ustc.edu.cn | 教育网用户访问效果可能较好 |
| 南京大学镜像站 | https://docker.nju.edu.cn | 支持 Docker Hub、GCR、GHCR、Quay、NVCR 等 |
| Docker 中国官方镜像 | https://registry.docker-cn.com | 官方认证,适合企业环境 |
Docker 会严格按照配置文件中列出的顺序来尝试镜像源,这时如果第一个源出现问题了,它会继续尝试第二个,以此类推。
它不会自动选择'最快'的镜像源。因此建议将最稳定、最快、最可靠的镜像源放在第一位。
{"registry-mirrors":["https://docker.m.daocloud.io","http://hub-mirror.c.163.com","https://docker.nju.edu.cn"]}
注意:这些镜像源的设置不会影响docker search 命令的搜索来源,docker search 默认依然是从 Docker Hub 的官方仓库查询。
3.4 重启 Docker 服务
sudo systemctl restart docker
如果修改了服务配置(例如,修改了 Docker 的 docker.service 文件中的环境变量、启动参数或依赖关系),systemd(Linux 的系统和服务管理器)并不会自动感知到这个变化。
systemctl daemon-reload 命令会通知 systemd 去重新读取并加载所有服务单元文件的更改,使新的配置生效。
当然,它只是让 systemd 记住了新的配置,只有下次启动服务时才会应用。
我们当前修改的配置文件是 daemon.json,在重启服务前无需执行 sudo systemctl daemon-reload 这个命令。
3.5 验证配置
重启后,查看一下镜像源配置是否成功。可以看到相比最初,增加了 Registry Mirrors。
3.6 测试
现在我们可以正常拉取镜像并执行了,拉取(如果本地没有)hello-world 镜像,并创建一个新的容器来运行它,输出'Hello from Docker!'等信息,则表明成功。
sudo docker container run hello-world
四、添加当前用户到用户组
4.1 权限说明
默认情况下,只有 root 用户和组名为 docker 的用户组用户才能执行 Docker 命令。
普通用户执行 Docker 命令时需要添加 sudo,如果觉得麻烦,可以将用户添加到 Docker 用户组。
Docker 守护进程(dockerd)启动后,会创建一个用于通信的 Unix 套接字(Socket)文件,默认路径是 /var/run/docker.sock。
通过命令可以查看到这个文件的详细信息:
这里的关键信息是:所有者 (Owner): root所属组 (Group): docker权限 (Permissions): srw-rw----(其中的 rw- 表示所属组具有读写权限)
这意味着:root 用户 永远可以直接操作这个套接字(所以用 sudo 总能运行 Docker 命令)。所有属于 docker 组 的用户也具有读写权限,因此可以无需 sudo 直接与 Docker 守护进程通信。其他用户则没有任何权限。
虽然可以通过修改配置文件 daemon.json 的方式,修改默认组名,但不推荐。
4.2 查看用户组
默认情况下,安装好 Docker 后,会自动创建一个用户组,通过以下命令可以查看 docker 组 信息。
/etc/group 文件存储了系统中所有用户组(Group) 的定义信息,其中的每一行都代表一个用户组,其格式由冒号 : 分隔为四个字段。
| 示例值 | 含义 |
|---|
docker | 用户组的名称。这就是你查询的组。 |
x | 经过加密的组密码。几乎总是显示为 x,表示密码实际上被存储在更安全的 /etc/gshadow 文件中。通常组密码很少使用。 |
988 | 组 ID (GID)。这是系统用来识别这个组的唯一数字。这个数字在不同系统上可能不同(常见的有 999, 998 等),988 是完全正常的。 |
| (空) | 属于该组的用户成员列表。这个字段是空的,表示目前没有用户被直接添加为这个组的成员。 |
如果没有任何返回,那么可以执行 sudo groupadd docker 命令去创建一个名为 docker 的用户组。
4.3 添加当前用户
sudo usermod -aG docker $USER
usermod:修改用户属性的命令
-aG:追加到附加组 (Append to Supplementary Groups)
docker:目标用户组的名称
$USER:shell 环境变量,代表当前用户名
完成后,再次查看用户组,可以看到当前用户已经添加成功。
4.4 切换到 docker 组
newgrp 命令的主要目的是临时性地将当前用户会话(terminal session)的主要组(primary group)或附加组(supplementary group)的权限生效。
当前用户已经添加到 docker 组,这个更改虽然被写入了 /etc/group 文件,但不会自动应用到你已经登录的当前会话中。
- 注销后重新登录(最彻底的方式)。
- 打开一个新的终端窗口(新的会话会读取新的组信息)。
- 使用
**newgrp** 命令(如果执行 exit 命令会退回到当前用户之前的权限)。
我们使用 FinalShell 连接,其实打开一个新的终端窗口更方便。
4.5 测试
执行一个 Docker 命令不加 sudo,比如 docker images,可以看到命令正常运行。
相关免费在线工具
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
- JSON美化和格式化
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online