Docker多架构容器镜像构建方式

   日期:2024-12-26    作者:ahdouyin 移动:http://mip.riyuangf.com/mobile/quote/56120.html

点击上方蓝字⭐️关注“DevOps云学堂”,接收最新技术实践

今天是「DevOps云学堂」与你共同进步的第 39 

第⑦期DevOps实战训练营·招新中



在这篇博文中,我们将了解什么是多架构容器镜像?怎么运行的?如何建设和推广?我们将编写一个示例代码,用于在 CI/CD 管道中构建多架构镜像。

多架构 Docker 镜像是一个镜像列表,其中引用了为多个 CPU 架构编译的二进制文件和库。当我们需要在不同的 CPU 架构(ARM、x86、RISC-V 等)上运行相同的应用程序而无需为每个架构创建单独的镜像时,这种类型的镜像非常有用。

性能和成本优化:容器多架构用于优化不同CPU架构上的性能。通过构建和部署针对特定架构优化的镜像,我们可以获得更好的性能并减少资源使用。
跨平台开发:如果您正在开发需要在多个平台上运行的应用程序,例如ARM和x86,您可以使用buildx构建多架构Docker镜像并在不同架构上测试应用程序。
IoT 设备:许多 IoT/Edge 设备使用 ARM 处理器,这需要与 x86 处理器不同的二进制文件和库。通过多架构映像,您可以创建可在 ARM、x86 和 RISCV 设备上运行的映像,从而更轻松地将应用程序部署到各种 IoT 设备。

使用多架构容器镜像的几个优点是

  • 能够在多个 CPU 架构上运行 Docker 镜像

  • 使我们能够选择环保的CPU架构

  • 从一种架构无缝迁移到另一种架构

  • 使用arm64获得更好的性能并节省成本

  • 能够使用arm64支持每个CPU更多的内核

构建多架构容器的方法有多种,但我们将重点关注广泛使用且简单的方法。

  1. 传统 Docker 构建命令

  2. 使用Docker buildx

使用传统的 Docker 构建命令

在本教程中,我们将在不同 CPU 架构的机器上手动构建两个镜像,并将它们推送到容器注册表(例如 Dockerhub,然后创建包含两个镜像引用的清单文件。清单文件是一个简单的 JSON 文件,其中包含容器映像的索引及其元数据,例如映像大小、sha256 摘要、操作系统等。稍后我们将在本博客中了解有关清单文件的更多信息。
例如。这是我们的基本 Dockerfile。

使用 Docker Buildx

使用 buildx,我们只需要运行一个具有参数化架构的命令。

在后台, 命令使用 ,因此当我们运行上述命令时,它会创建一个带有 映像的容器,该容器具有用于多个 CPU 架构的,负责模拟 。我们可以通过在正在运行的容器中运行来查看这些 QEMU 二进制文件。

在上面的命令中,我们传递了所以它使用QEMU 二进制文件来构建 映像,并且 是在主机上本地构建的。构建两个映像后,它会使用该选项创建清单文件,并将两个映像与清单文件一起推送到注册表服务器。

通过检查清单文件,我们可以看到字段包含实际的镜像链接,当与主机系统架构匹配时将获取该链接。

我们还可以使用 命令以更易于理解的格式查看相同的输出。

如果您在构建多架构映像时遇到任何问题,可以运行以下命令来重置 条目。

我们还可以使用 Buildah构建多架构容器镜像。


如果您的工作负载运行在具有不同 CPU 架构的多台计算机上,那么为您的应用程序构建多架构 Docker 映像总是更好。将多架构构建集成到 CI/CD 中可以更轻松地简化映像构建和扫描过程,仅添加一个 Docker 标签,并节省时间。下面我们编写了用于构建多架构镜像的 和 示例代码。

Jenkins 多架构 CI

目前,Jenkins Docker 插件不支持多架构构建,因此我们可以使用 buildx 来构建多架构镜像。

否则,我们可以在 Jenkins 阶段中使用传统的 Docker 构建命令,如上所示,具有不同的 Jenkins 工作节点集。

用于构建多架构容器映像的 GitHub CI 管道

GitHub Actions还支持多架构容器映像。它还在后台使用 QEMU CPU 模拟。

提升 Docker 多架构需要一些额外的步骤,因为该命令仅根据主机的 提取单个映像。为了推广多架构Docker镜像,我们需要使用以下方法一一拉取所有CPU架构镜像,然后创建清单文件并将其推送到新的注册服务器。为了避免这些复杂的步骤,我们可以利用以下工具。
或可用于仅使用一个命令即可将我们的多架构映像从一个帐户提升到另一个帐户。在后台,这些工具的作用是使用获取所有多架构映像,然后创建清单并推送所有映像和清单。

如果只想使用 Docker 命令将该镜像提升到更高的环境(Production)怎么办

我们可以使用等任何工具进行镜像扫描,但我们必须将多架构镜像一一拉取然后扫描它们,因为默认情况下 命令只会获取与主机 CPU 匹配的一个镜像。我们可以利用 命令来拉取不同的 CPU 架构镜像。我们可以这样做

使用多架构容器有显着的好处,但在采取行动之前,您当然应该注意一些注意事项。

  • 存储其他架构镜像需要额外的存储空间。

  • 构建多架构容器映像也需要时间,而在 QEMU 仿真上构建 arm64 会消耗大量时间和资源。

  • 与本机运行二进制文件相比,在不同 CPU 上模拟运行二进制文件的性能明显较低。

  • buildx 构建arm64 映像仍然存在一些问题,例如基础映像在arm64 中不可用,并且执行sudo 级别访问或构建交叉编译静态链接二进制文件需要额外的步骤。

  • 需要对所有镜像进行容器一一扫描。

  • Buildx 多架构构建仅在 amd64 CPU 架构上受支持。

在本博客中,我们了解了什么是多架构容器及其用例。我们通过示例代码将多架构构建与 Jenkins 和 Github CI 集成,并为您提供了几种推广和扫描多架构容器映像的方法,最后,我们了解了使用多架构容器的注意事项。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号