Docker 稳定性保障:Ubuntu 环境版本锁定方案

作为许多开发和生产环境中基础设施的重要组成部分,docker 的版本稳定性直接影响着整个系统的可靠性。本文将详细介绍如何有效地管理和固定 docker 的版本。

在开始之前,不得不提到 Docker 已经诞生了十二年。作为容器化技术的先驱,它已经成为众多开发者和企业的必备工具。然而,随着 Docker 的不断发展,频繁的版本更新也带来了不少问题。

许多开发者可能都曾遇到过这样的困境:之前运行良好的容器,在更新 Docker 版本后突然出现了各种奇怪的问题。这些问题可能是配置文件不兼容、命令参数变化,甚至影响到整个应用的稳定性。

更令人头疼的是,当试图解决这些问题时,网上搜索到的许多文章要么已经过时,要么就是简单地复制粘贴一些错误的或已经失效的命令。这不仅无法解决问题,还会浪费大量的时间。(在使用这些命令时,你是否考虑过它们的可靠性?)

基于这些原因,我决定撰写这篇文章,详细介绍如何在 ubuntu 环境中有效地管理和固定 Docker 版本,帮助你避免版本更新带来的各种意外问题。

准备工作:Docker 安装如果你的系统中尚未安装 Docker,可以参考我之前写的《搭建 Ubuntu 24.04 基础开发环境指南》,文章中详细介绍了 Docker 的安装和基础配置步骤。

实战过程首先,我们需要找出系统中已经安装的 Docker 相关包。

查找 Docker 依赖软件包我们可以使用 dpkg-query 命令来查询系统中已安装的软件包,并用 grep 筛选出 Docker 相关的内容:

# dpkg-query -l | grep docker ii  docker-buildx-plugin                          0.20.0-1~ubuntu.24.04~noble              arm64        Docker Buildx cli plugin. ii  docker-ce                                     5:27.5.1-1~ubuntu.24.04~noble            arm64        Docker: the open-source application container engine ii  docker-ce-cli                                 5:27.5.1-1~ubuntu.24.04~noble            arm64        Docker CLI: the open-source application container engine ii  docker-ce-rootless-extras                     5:27.5.1-1~ubuntu.24.04~noble            arm64        Rootless support for Docker. ii  docker-compose-plugin                         2.32.4-1~ubuntu.24.04~noble              arm64        Docker Compose (V2) plugin for the Docker CLI. ii  python3-docker                                5.0.3-1ubuntu1.1                         all          Python 3 wrapper to Access docker.io's control socket

为了避免手动复制粘贴可能带来的错误,我们可以使用 awk 命令来提取包名。使用命令获取软件包名还有一个好处,即在 docker 软件依赖发生变化后,相较于手动“复制粘贴”,使用命令可以自适应解决问题。

# dpkg-query -l | grep docker | awk '{print $2}' docker-buildx-plugin docker-ce docker-ce-cli docker-ce-rootless-extras docker-compose-plugin python3-docker

日志中的结果就是 Docker 的主要程序组件依赖。不过,这只是处理了那些名字中明显包含 “docker” 关键词的包。接下来,我们还需要处理一些可能被遗漏的依赖包。

深入了解 Docker 软件包依赖关系在研究 Docker 的子依赖时,我们可以使用 apt-cache depends 结合 xargs 来进行分析。

首先,让我们看看如何获取相关软件包的依赖情况:

# dpkg-query -l | grep docker | awk '{print $2}' | xargs -I {} apt-cache depends {} docker-buildx-plugin   Replaces: docker-ce-cli   Enhances: docker-ce-cli docker-ce   Depends: containerd.io   Depends: docker-ce-cli   Depends: iptables   Depends: libseccomp2   Depends: libc6   Depends: libsystemd0   Conflicts: <docker>   Conflicts: <docker-engine>   Conflicts: docker.io   Recommends: apparmor   Recommends: ca-certificates   Recommends: docker-ce-rootless-extras   Recommends: git   Recommends: kmod   Recommends: libltdl7   Recommends: pigz   Recommends: procps   Recommends: xz-utils   |Suggests: cgroupfs-mount   Suggests: cgroup-lite   Replaces: <docker-engine> docker-ce-cli   Depends: libc6   Conflicts: <docker>   Conflicts: <docker-engine>   Conflicts: docker.io   Breaks: docker-ce   Recommends: docker-buildx-plugin   Recommends: docker-compose-plugin   Replaces: docker-ce docker-ce-rootless-extras   Depends: dbus-user-session   Depends: libc6   Conflicts: rootlesskit   Breaks: rootlesskit   Recommends: slirp4netns   Replaces: rootlesskit   Enhances: docker-ce docker-compose-plugin   Enhances: docker-ce-cli python3-docker   Depends: python3-requests   Depends: python3-websocket   Depends: <any>     python3   Depends: python3-packaging   Depends: python3-urllib3   Breaks: python3-minimal </any> </docker-engine> </docker> </docker-engine> </docker-engine> </docker>

这个命令会为我们展示详细的依赖信息,包括:

  • 必需依赖(Depends)
  • 推荐安装(Recommends)
  • 冲突包(Conflicts)
  • 替换包(Replaces)

考虑到我们主要关注稳定环境下的版本控制和简化维护工作,我们本身不会强制安装古早的淘汰软件包,也不会强制安装冲突软件包。所以,重点应该放在 Depends 和 Recommends 这两类依赖上。我们可以这样继续筛选:

# dpkg-query -l | grep docker | awk '{print $2}' | xargs -I {} apt-cache depends {} | grep -E "Depends|Recommends"   Depends: containerd.io   Depends: docker-ce-cli   Depends: iptables   Depends: libseccomp2   Depends: libc6   Depends: libsystemd0   Recommends: apparmor   Recommends: ca-certificates   Recommends: docker-ce-rootless-extras   Recommends: git   Recommends: kmod   Recommends: libltdl7   Recommends: pigz   Recommends: procps   Recommends: xz-utils   Depends: libc6   Recommends: docker-buildx-plugin   Recommends: docker-compose-plugin   Depends: dbus-user-session   Depends: libc6   Recommends: slirp4netns   Depends: python3-requests   Depends: python3-websocket   Depends: <any>   Depends: python3-packaging   Depends: python3-urllib3 </any>

我们从输出结果中,能够看到非常清晰的依赖关系,其中主要包括:

  • 基础组件:containerd.io、iptables、libseccomp2
  • 系统库:libc6、libsystemd0
  • 工具包:docker-ce-cli、docker-buildx-plugin
  • 安全相关:apparmor、ca-certificates
  • 其他工具:git、kmod、pigz、procps

其中一个依赖支持“任意版本的 Python 软件包”,所以在后续处理过程中,我们可以将这个依赖项去掉。

为了让结果更清晰易读,我们可以用 sed 来继续优化输出格式,只保留包名:

dpkg-query -l | grep docker | awk '{print $2}' | xargs -I {} apt-cache depends {} | grep -E "Depends|Recommends" | grep -v ":any" | sed 's/^[[:space:]]*(Depends|Recommends): //' containerd.io docker-ce-cli iptables libseccomp2 libc6 libsystemd0 apparmor ca-certificates docker-ce-rootless-extras git kmod libltdl7 pigz procps xz-utils libc6 docker-buildx-plugin docker-compose-plugin dbus-user-session libc6 slirp4netns python3-requests python3-websocket python3-packaging python3-urllib3

这样就得到了一个简洁的 Docker 核心依赖列表,对于我们理解当前版本的 Docker 的组件构成和进行环境配置都很有帮助。

编写软件包获取脚本程序有了前面的经验,我们可以写一个更完整的脚本,来获取所有软件包的依赖列表。这对我们后续锁定特定软件包会很有帮助。

#!/bin/bash # 创建临时文件存储所有依赖 temp_file=$(mktemp) # 获取所有 docker 相关包的依赖 dpkg-query -l | grep docker | awk '{print $2}' | while read pkg; do     echo "=== Dependencies for $pkg ===" >> "$temp_file"     apt-cache depends "$pkg" | grep -E "Depends:|Recommends:" |      grep -v "> " >> "$temp_file"     echo >> "$temp_file" done # 显示所有依赖(带包名标题) cat "$temp_file" echo -e "n=== Unique dependencies (sorted) ===" # 提取唯一的依赖项并排序 grep -v "^===" "$temp_file" |  grep -v "^$" |  sort -u # 清理临时文件 rm "$temp_file"

我们将这个脚本保存为 get_docker_dependencies.sh,并运行它:

./get_docker_dependencies.sh

这样,我们就能够得到一个完整的 Docker 依赖列表,并且可以根据需要进行版本锁定。

Docker 稳定性保障:Ubuntu 环境版本锁定方案

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享