Docker镜像多架构构建介绍

前言:

目前arm系统越来越常见,对镜像的多架构需求也越来越大。对于同一个镜像,最简单的办法就是在amd64或arm机器上build后通过不同的tag进行区分,比如 nginx:v1-amd64 、 nginx:v1-arm64 ,但这种方式比较丑陋,而且没有对应架构的机器用来构建怎么办?

目前最新的办法就是使用buildx来进行构建,不过这个特性目前默认是没启用的,需要在docker的配置文件中添加 "experimental": true 后重启docker服务生效。

首先执行下面的命令让amd64的机器也可以构建arm的镜像:

docker run --rm --privileged tonistiigi/binfmt:latest --install all

然后创建一个新的build实例:

docker buildx create --use --name=mybuilder-cn --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master

这样准备工作就全都做好了。

接下来以一个kubebuilder命令创建的operator项目默认的Dockerfile为例:

# Build the manager binary
FROM --platform=$TARGETPLATFORM golang:1.16 as builder
ARG TARGETOS TARGETARCH
WORKDIR /workspace
# Copy the Go Modules manifests
COPY go.mod go.mod
COPY go.sum go.sum
# cache deps before building and copying source so that we don't need to re-download as much
# and so that source changes don't invalidate our downloaded layer
RUN go mod download

# Copy the go source
COPY main.go main.go
COPY api/ api/
COPY controllers/ controllers/

# Build
RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -a -o manager main.go

# Use distroless as minimal base image to package the manager binary
# Refer to https://github.com/GoogleContainerTools/distroless for more details
FROM --platform=$TARGETPLATFORM gcr.io/distroless/static:nonroot
WORKDIR /
COPY --from=builder /workspace/manager .
USER 65532:65532

ENTRYPOINT ["/manager"]

修改点有2个:

--platform=$TARGETPLATFORM
GOOS=${TARGETOS} GOARCH=${TARGETARCH}

这些TARGET开头的变量可以在参考链接2里看到全部含义。

接下来使用这个文件进行构建:

docker buildx build -t hello/namespace/name:v1 -f Dockerfile . --platform linux/amd64,linux/arm64 --push

注意这里的 buildx 、 --platform 参数后面跟随需要构建的版本、以及 --push ,buildx构建的多架构镜像要么使用这个参数push到镜像仓库,要么使用 --load 加载到本地,不可省略。

构建完成后就会生成相应的多架构镜像了,可以使用 docker manifest inspect 来进行验证,比如:

docker manifest inspect hello/namespace/name:v1
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 1367,
"digest": "sha256:a7b99854e13939e3beaf21c1da8b4654022018eda9f438155b18ae16eeff49a5",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 2169,
"digest": "sha256:844885928813685ffa8c5ea4c6e9e7a09d95ac79e417afae0be7b73086762cfd",
"platform": {
"architecture": "arm64",
"os": "linux"
}
}
]
}

可以看出确实是生成了多个架构的镜像,使用时直接在不同架构的机器上pull就会自动下载对应的架构镜像了。或者也可以使用 docker pull --platform arm64|amd64 xxxxx 来指定拉取镜像的架构。

对于某些没有办法使用buildx的场景,我们可以手动build不同架构的镜像,然后再手动创建manifest,比如:

# 指定拉取amd64架构
docker pull --platform amd64 gcr.io/distroless/static:nonroot
# 重新打tag
docker tag 9ef34 hello/ns/static:nonroot-amd64
# 推送
docker push hello/ns/static:nonroot-amd64

# 指定拉取arm64架构
docker pull --platform arm64 gcr.io/distroless/static:nonroot
# 重新打tag
docker tag 91714 hello/ns/static:nonroot-arm64
# 推送
docker push hello/ns/static:nonroot-arm64

## 制作manifest
docker manifest create hello/ns/static:nonroot hello/ns/static:nonroot-amd64 hello/ns/static:nonroot-arm64
docker manifest push hello/ns/static:nonroot
docker manifest rm hello/ns/static:nonroot

重点是最后3行,push manifest后使用就和第一种方法一样了。

另外如果想进行多架构构建有几个注意点:

yum|apt install

其他 查看镜像仓库里都有哪些镜像:

curl -u "用户名":"密码" -X GET http://镜像地址:5000/v2/_catalog?n=2000 | python -m json.tool

查看镜像有哪些tag:

curl -u "用户名":"密码" -X GET http://镜像地址:5000/v2/命名空间/镜像名称/tags/list | python -m json.tool

到此这篇关于Docker镜像多架构构建介绍的文章就介绍到这了,更多相关Docker镜像 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于构建aarch64环境Mysql8.0的Docker镜像问题

    目录 1. 获取构建mysql镜像的脚本 2.预先下载gosu-arm64.gosu-arm64.asc ,并放到mysql/8.0目录下 3.修改Dockerfile.oracle,使用本地下载的gosu 4.执行构建Docker镜像 1. 获取构建mysql镜像的脚本 git clone https://github.com/docker-library/mysql.git 2.预先下载gosu-arm64.gosu-arm64.asc ,并放到mysql/8.0目录下 wget -c ht

  • Docker Buildx构建多平台镜像的实现

    目录 写在前边 构建环境 启用BuildX 安装qemu-user-static 通知Docker使用qemu 创建Buildx构建容器 调整Dockerfile接收平台相关参数 同时构建X86_64与ARM64镜像 写在最后 写在前边 记录一下前阵子在X86_64平台使用Docker Buildx构建多平台镜像的办法,包含但不限于构建ARM镜像. 构建环境 软件名 版本 Ubuntu 18.04.2 LTS Docker 20.10.16 Ubuntu 和 Fedora 安装构建环境比较方便,

  • docker通过Dockerfile构建mysql镜像的方法

    构建Dockerfile ,路径 /docker/mysql FROM hub.c.163.com/library/mysql:5.7 #作者信息 MAINTAINER hu "***@qq.com" #修改编码方式 RUN echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf RUN service mysql restart EXPOSE 3306 到Docker

  • Docker构建镜像的两种方式实现

    目录 从已有镜像更新镜像: 从零开始构建镜像: 从 docker 镜像仓库中下载的镜像不能满足我们的需求时,可以通过以下两种方式对镜像进行更改. 从已有镜像更新镜像 从零开始构建镜像 从已有镜像更新镜像: 更新镜像之前,我们需要使用镜像来创建一个容器. 进入容器: docker run -t -i db2b37ec6181 /bin/bash 在运行的容器内使用 apt-get update 命令进行更新.在完成操作之后,输入 exit 命令来退出这个容器. 此时 ID 为 0aab061e6f

  • Jenkins构建Docker镜像并推送至Harbor仓库的实现

    目录 Dockerfile文件 pom.xml Jenkins配置 ​ spring boot项目通过Jenkins集成构建Docker镜像推送到harbor仓库并启动容器然后拉取镜像到本地运行容器 Dockerfile文件 位置:存在根目录下,与src同级 FROM java:8 # 作者 MAINTAINER zhaoyc VOLUME /tmp #ARG JAR_FILE #将jar包添加到容器中并更名为app.jar ADD target/*.jar app.jar RUN bash -

  • Dockerfile文件编写及构建镜像命令解析

    目录 指令解析 简单的Dockerfile文件 Build命令添加dockerfile参数 构建镜像 构建容器并端口映射启动 镜像上传到远程镜像仓库 部署 指令解析 FROM # 基于什么镜像 WORKDIR # 指定工作路径,没有就创建目录 ------ COPY # 拷贝,文件地址 ADD # 拷贝,也可以是文件地址,也可以是url网络资源 ------ RUN # 运行shell语句 ------ ENTRYPOINT 1.运行容器时,执行的脚本.可以是json数据指定,也可以是shell

  • dockerfile指令构建docker镜像的示例代码

    目录 初识Dockerfile 编写一个自己的docker 镜像: DockerFile docker build . 命令 查看镜像是如何生成的 初识Dockerfile Dockerfile就是用来构建docker镜像的构建文件!命令脚本! 通过这个脚本可以生成镜像,镜像是一层层的,脚本是一行行的命令,每行命令都是一层 dockerfile是面向开发的,我们以后要发布项目,作镜像,就需要编写dockerfile文件,这个文件十分简单. Dockerfile镜像之间成为了企业交付的标准,必须掌

  • Docker镜像多架构构建介绍

    前言: 目前arm系统越来越常见,对镜像的多架构需求也越来越大.对于同一个镜像,最简单的办法就是在amd64或arm机器上build后通过不同的tag进行区分,比如 nginx:v1-amd64 . nginx:v1-arm64 ,但这种方式比较丑陋,而且没有对应架构的机器用来构建怎么办? 目前最新的办法就是使用buildx来进行构建,不过这个特性目前默认是没启用的,需要在docker的配置文件中添加 "experimental": true 后重启docker服务生效. 首先执行下面

  • Docker 镜像导入导出过程介绍

    docker save 说明:将指定镜像保存成 tar 归档文件,以tar和tar.gz结尾都行. 语法: docker save [OPTIONS] IMAGE [IMAGE...] OPTIONS 说明: -o :输出到的文件. [root@harbor tmp]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE redis v1 cc6cf492f595 6 hours ago 113MB busybox latest beae173c

  • Docker镜像制作详解介绍

    最近由于工作原因,需要对Docker镜像进行制作,这里记录下,也许对大家也有一定帮助! 写在前面:本文docker镜像制作方法更适用于基于已有docker镜像一次性修改. 推荐用Docker File制作docker镜像. 原理是一样的,但是用docker file制作docker镜像能够记录下操作步骤,方便以后更改或者镜像丢失后重新创建. 本文以Ubuntu为基础镜像,预启动一个django项目和ssh服务,制作一个新的镜像. 1.基础镜像 我选用的是从Docker官网下载的ubuntu镜像.

  • docker 镜像加速CentOS7详细介绍

    前言 在Docker Hub官网上注册帐号,即可下载使用仓库里的全部的docker镜像.而因为网络原因,国内的开发者没办法流畅的下载镜像,经常会出现下载中断的错误.解决方法就是使用国内的容器Hub加速服务,本质就是更改pull优先级较高的服务器为国内的站点. 国内docker镜像加速站 阿里云 DaoCloud 灵雀云 系统环境 操作系统: CentOS 7 docker版本: 1.9.1 DaoCloud加速 DaoCloud现在是提供一个一键脚本配置registry-mirror,然而对于上

  • 使用docker build kit构建树莓派上可用的Docker镜像

    Docker安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG ${user_name} build-kit是什么 参考build ARM based Docker Images 简单来说就是扩展docker build的一个实验性的功能 以bind为案例进行构建 docker-bind项目是一个开源的自定义DNS部署服务,但是并没有提供基于linux/aarch

  • 构建Golang应用最小Docker镜像的实现

    我通常使用docker运行我的 golang 程序,在这里分享一下我构建 docker 镜像的经验.我构建 docker 镜像不仅优化构建后的体积,还要优化构建速度. 示例应用 首先贴出代码例子,我们假设要构建一个 http 服务 package main import ( "fmt" "net/http" "time" "github.com/gin-gonic/gin" ) func main() { fmt.Printl

  • 详解使用阿里云镜像仓库构建国外Docker镜像

    使用阿里云镜像仓库下载国外镜像 在日常使用 Docker 或 K8S 的过程中,经常会需要到国外的网站中下载镜像,但是有些网站在国内是无法访问的.对于这个问题可以使用阿里云提供的镜像仓库进行下载,然后 pull 到本地并修改 tag 来实现. 例如在使用 K8S 部署 Istio 时,需要下载 gcr.io/istio-testing/install-cni:1.5-dev 镜像,可以根据如下步骤在阿里云中进行构建和下载: 一.配置 Github 首先登录 Github 中创建一个用于构建镜像的

  • Spring Boot 2.4 新特性之一键构建Docker镜像的过程详解

    背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中. spotify .fabric8 这里主要使用的主要是如下两种插件 spotify .fabric8 , - -配置通过 xml 定义出 Dockerfile 或者挂载外部 Dockerfile 通过调用

  • SpringBoot创建Docker镜像的方法步骤

    随着越来越多的组织转向容器和虚拟服务器,Docker正成为软件开发工作流程中一个更重要的部分.为此,Spring Boot 2.3中最新的功能之中,提供了为Spring Boot应用程序创建 Docker 镜像的能力. 这篇文章的目的,就是为了给大家介绍如何为 Spring Boot 应用程序创建 Docker 镜像. 1. 传统Docker构建 使用Spring Boot 构建 Docker 镜像的传统方法是使用 Dockerfile .下面是一个简单的例子: FROM openjdk:8-j

随机推荐