Docker Buildx 与 CNB 多平台构建实践

server/2024/12/2 23:23:32/

一、Docker Buildx 功能介绍

docker buildx 是 Docker 提供的一个增强版构建工具,支持更强大的构建功能,特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。

1.1 主要功能

多平台构建支持

  • 使用 docker buildx,可以在单台设备上构建多平台的镜像(如 linux/amd64linux/arm64 等)。
  • 构建方式无需实际运行在目标架构上,借助 QEMU 实现跨平台模拟

分布式和并行构建

  • buildx 支持在分布式环境下进行并行构建,将构建任务分配到多台设备。
  • 支持多个后端驱动(如 Docker 本地引擎、Kubernetes 集群等),可以根据需求选择构建环境。

缓存导入与导出

  • 在构建镜像时,可以导入和导出缓存以提升构建效率,尤其在 CI/CD 环境中。

镜像的直接推送

  • 构建完成的镜像可以直接推送到 Docker Registry,无需本地保存。

1.2 Buildx 构建演示

下面是一个简单的 Dockerfile,它创建了一个非常小的镜像,并且可以用来测试 docker buildx 对 ARM 和 x86 平台的支持:

# 使用最小的Alpine镜像
FROM --platform=$BUILDPLATFORM alpine:latest# 设置工作目录
WORKDIR /app# 简单的命令,输出平台信息
RUN echo "Building for platform: $BUILDPLATFORM"# 默认执行命令
CMD ["echo", "Hello from Docker!"]

解释:

  • FROM --platform=$BUILDPLATFORM alpine:latest:使用 alpine:latest 镜像,并根据 docker buildx 的平台选择功能自动切换平台(x86 或 ARM)。
  • RUN echo "Building for platform: $BUILDPLATFORM":在镜像构建时输出当前的构建平台信息。
  • CMD ["echo", "Hello from Docker!"]:构建并运行容器时执行的简单命令。

1.2.1 创建一个Buildx 构建实例

用于管理和执行 Docker Buildx 的构建任务

docker buildx create --name srebro

切换到名为 srebro 的 Buildx 构建实例,并将 srebro 设置为默认的构建器

docker buildx use srebro

初始化并启动一个 buildx 容器

docker buildx inspect --bootstrap

image-20241130113017881

1.2.2 构建多平台镜像

这里我使用 cnb 的容器仓库作为镜像的存放仓库

image-20241130113445557

登录 cnb 容器仓库

$ docker login -u cnb docker.cnb.cool

image-20241130113549522

构建镜像并推送镜像仓库,这里同时构建 x86 和 arm 的镜像

$ docker buildx build --platform linux/amd64,linux/arm64 -t docker.cnb.cool/srebro/docker-images/hello:latest --push .

image-20241130114126788

可以看到镜像已经成功的推送到 cnb 镜像仓库上了,有 arm 和 x86 两种镜像

image-20241130114208564

二、如何使用CNB 构建多平台镜像

CNB 云原生构建平台,这里我不详细介绍,用过 coding 的人 应该会很熟悉,我知道的是原班 coding 和 之前 QQ 空间的 大佬 一起联合 做的一个 云原生构建平台。https://cnb.cool/

2.1 CNB 创建一个代码仓库

步骤忽略,自行探索,官方文档写的很详细

2.2 在CNB上构建一个 Redis 多平台容器镜像

  • 仓库示例地址: https://cnb.cool/srebro/redis

  • 如何在 cnb 上构建多平台镜像,官方 demo: https://cnb.cool/examples/showcase

  • 构建过程文件: https://cnb.cool/srebro/redis/-/blob/main/.cnb.yml

  • 自定义构建按钮: https://cnb.cool/srebro/redis/-/blob/main/.cnb/web_trigger.yml

image-20241130120109502

一键构建 ,嘎嘎发射 🚀 🚀 🚀

构建结果:

image-20241130120504669

镜像仓库地址:

这里其实也是用到了dockermanifest 技术。

Docker 的 manifest 是镜像的元数据文件,包含镜像的层、配置、平台信息等。它是管理和存储 Docker 镜像的关键部分,特别是在处理多平台构建时,manifest 使得 Docker 能够根据平台选择正确的镜像版本。

2.3 使用CNB回传镜像

懂得都懂,墙外的镜像 在国内基本上都很难拉取,不过也有一些解决方法,比如github 的actions,不过往往 github 的网址都要打开好久,不是很友好;

那何尝不如去 试试 CNB 的 呢, 他们的构建机器 有 arm 的 也有x86 的,构建的速度 也挺快,我听说都是做了加速的。搞个自定义参数流水线,构建镜像并直接保存在CNB镜像仓库上了,岂不是很方便;或者说调用 CNB 的 API 接口,远程构建 等等。。。。。这里不展开了, 自行脑补


http://www.ppmy.cn/server/146864.html

相关文章

Python 爬虫 (1)基础 | Request与Response

文章目录 一、Request包1、发送请求1.1、关键字参数1.2、应用示例 2、处理响应 前言: 在Python编程中,经常需要从互联网上获取或发送数据,这涉及到了网络编程。而在网络编程中,HTTP请求是不可或缺的一部分。Python的Requests包是一…

Vue构建错误解决:(error TS6133)xxx is declared but its value is never read.

TypeScript会检查代码中未使用的变量,如果vscode安装了Vue的语法检查工具,会看到告警提示,再npm run build的时候,这个警告会变成错误 解决方案1:删除定义了未使用的变量 推荐使用这种方案,能保证代码的质…

JAVA项目-------医院挂号系统

1,项目目的 1、科室管理:新增科室,删除科室(如果有医生在,则不能删除该科室),修改科室。 2、医生管理:录入医生信息,以及科室信息。修改医生信息(主要是修改…

【K8s】【部署】集群部署

1 主机/服务规划 主机IP主机名节点功能类型服务分布192.168.199.20k8s.master.vip vip虚拟IP192.168.199.21k8s01k8s-MasterKeepalived、HAProxy、Docker192.168.199.22k8s02k8s-MasterKeepalived、HAProxy、Docker192.168.199.23k8s03k8s-NodeDocker192.168.199.24k8s04k8s-N…

Z2400039基于Java-+ SpringBoot + vue 企业信息管理系统的设计与实现(源码 配置 PPT 文档 分享)

企业信息管理系统 1.项目描述2.项目结构后端(Spring Boot)前端(Vue.js Element UI) 2. 功能实现登录页首页系统管理岗位管理部门管理 3. 部署和运行注意事项 4.界面展示5.源码获取 1.项目描述 基于你的描述,这个项目…

buuctf-[SUCTF 2019]EasySQL 1解题记录

把你的旗帜给我,我会告诉你这面旗帜是对的。 堆叠注入查询数据库 1; show databases; ​ 查询表名 1; show tables; 获取flag 1;set sql_modepipes_as_concat;select 1

在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决

查看WSL版本 在 Windows 命令提示符(CMD)或 PowerShell 中,你可以使用以下命令来查看已安装的 WSL 发行版及其版本信息: wsl -l -v(base) PS C:\Users\Lenovo> wsl -l -vNAME STATE VERSION * Ubuntu-2…

android 安全sdk相关

前述 在网上有看到许多android安全sdk相关的内容,有重复的也有比较新鲜的内容,这里做一个整体的合集,以及后续又看到一些比较新的东西会一起放在这里。 android内sdk目前可以分为以下几个部分(有一些部分可能会存在一些重合&#…