[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像

docker,使用,buildx,构建,平台,x86,arm64,构架,镜像 · 浏览次数 : 0

小编点评

# 生成内容时需要带简单的排版 # 一、基础镜像 * 一个镜像的同一个tag下,点击文件夹后,进入多平台架构列表 * Artifacts拉取命令OS/ARCHTags大小sha256:c238d03b【有个文件夹】linux/amd64117.57MiBsha256:74842b33linux/arm64121.57MiB # 二、多平台基础镜像 * docker buildx build -t 镜像名:版本号-arm64 --platform linux/arm64 . --load * docker buildx build -t 镜像名:版本号-amd64 --platform linux/amd64 . --load12345 # 三、创建构建器 * docker buildx use builderx * 使用name=buildx的构造器,ls会出现*号表示正在使用中docker buildx inspect builderx --bootstrap # 四、启动name=builderx默认构造器 * docker buildx ls # 五、停止name=buildx的构建器 * docker buildx stop builderx

正文

https://blog.csdn.net/atzqtzq/article/details/128583331

配置文件激活buildx

  • docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx

    docker版本较低时,请升级docker版本

    $ vim /etc/docker/daemon.json
    {
      "experimental": true
    }
    
    • 1
    • 2
    • 3
    • 4
  • 重启docker
    #验证buildx版本
    docker buildx version
    

    重启docker ***

    systemctl restart docker

    检查是否启用

    docker info|grep Experimental

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

环境准备(需要联网)

  • 系统环境要求

    如果版本较低,需要升级内核

    uname -a #内核版本要求4.8+
    
    • 1
  • 安装binfmt,支持的平台
    安装编译时需要支持的平台,这里选择所有

    binfmt-support >= 2.1.7,需要联网docker-hub

    docker run --privileged --rm tonistiigi/binfmt --install all
    
    • 1
  • 初始化buildx构造器(不需要仓库https)

    1.创建name=mybuilder且自定义配置的构造器

    docker buildx create --use \
    --name mybuilder \
    --driver docker-container \
    --config /etc/buildkitd.toml  --use default
    
    • 1
    • 2
    • 3
    • 4

    2.其中自定义配置内容
    【修改配置后,要删除旧的,重新创建构造器】

    $ vi /etc/buildkitd.toml
    debug = true
    # root is where all buildkit state is stored.
    root = "/var/lib/buildkit"
    # insecure-entitlements allows insecure entitlements, disabled by default.
    insecure-entitlements = [ "network.host", "security.insecure" ]
    

    你的私库地址

    optionally mirror configuration can be done by defining it as a registry.

    [registry."192.168.69.150"]
    http = true
    insecure = true

    [registry."192.168.69.150:80"]
    http = true
    insecure = true

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 启动构建器,会自动下载并启动buildx_buildkit_mybuilder0 的容器,需要联网docker-hub
    docker buildx inspect mybuilder --bootstrap                      #启动name=mybuilder默认构造器
    docker buildx ls                                                 #列出所有的构造器和支持的平台
    docker buildx use mybuilder                                      #使用name=buildx的构造器,ls会出现*号表示正在使用中  
    docker buildx stop mybuilder                                     #停止name=buildx的构建器   
    
    • 1
    • 2
    • 3
    • 4

制作多平台基础镜像方式1:合并(docker manifest)

【可用docker buildx imagetools代替】

检查是否启用Experimental

docker info|grep Experimental #如果未启动,则需要配置,详见最顶端

docker manifest --help

  • 1
  • 2
  • 3

显示添加harbor-registry的80端口的配置

因为内网环境,未使用https,而且docker很多地方未完全实现兼容默认去掉80端口,
在以后的配置中最好是添加端口使用,避免不必要的坑。

$ vim /etc/docker/daemon.json
{
  "insecure-registries":["192.168.69.150:80","192.168.69.150"],
  "registry-mirrors":["http://192.168.69.150:80","http://192.168.69.150"]
}

重新登录

docker login 192.168.69.150:80

重启docker ***

systemctl restart docker

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

创建多镜像集合

docker manifest create --insecure  192.168.69.150:80/commandcenter/centos_arm:latest \
                                   192.168.69.150:80/commandcenter/centos_arm:v1
  • 1
  • 2
  • –insecure,允许不安全的服务
  • 192.168.69.150:80/commandcenter/centos_arm:lates,第一个镜像名为统一的名称
  • 192.168.69.150:80/commandcenter/centos_arm:v1,后面的表示要集成的子镜像名,当然可以集成多个子镜像
  • 删除使用docker manifest rm 【manifest统一镜像名称】

修改子镜像的架构名称(可选)

当有部分默认的os/arch值没有,或者太长时,可自定义修改

docker manifest annotate  192.168.69.150:80/commandcenter/centos_arm:latest \
                          192.168.69.150:80/commandcenter/centos_arm:v1 \
                          --os linux --arch arm64
  • 1
  • 2
  • 3
  • 指定v1版本为linux下的arm64架构

推送多镜像集合

docker manifest push --insecure  192.168.69.150:80/commandcenter/centos_arm:latest
  • 1
  • –insecure,允许不安全的服务

检查是否正常

  • 进入harbor,检查镜像是否有【文件夹】的图标,点击进入是否有OS/ARCH的列
  • 拉取测试
    此处命令兼容80端口,所以可省略
    docker pull --platform=linux/arm64/v8 192.168.69.150/commandcenter/centos_arm:latest
    
    • 1
    • 2
  • 使用buildx时,指定platform则使用OS/ARCH的列值
  • 查看已有镜像的manifest
    docker manifest inspect --insecure 192.168.69.150:80/commandcenter/centos_arm:latest 
    
    • 1

调整Dockerfile接收平台相关参数(可选,建议不写)

# 显示指定buildx传递--platform,但建议不写,在buildx后面传递platform参数即可,这样可兼容一般build命令
FROM --platform=$TARGETPLATFORM 基础镜像名:TAG
  • 1
  • 2

构建并导出到本地Docker images中

Dockfile中使用到的基础镜像需要支持多平台架构,如下harbor显示

一个镜像的同一个tag下,点击文件夹后,进入多平台架构列表;

Artifacts拉取命令OS/ARCHTags大小
sha256:c238d03b【有个文件夹】linux/amd64117.57MiB
sha256:74842b33linux/arm64121.57MiB
# 导出到本地只能构建一个镜像,本地不支持同时导出manifest lists
#arm64
docker buildx build -t 镜像名:版本号-arm64 --platform linux/arm64 . --load
#x86_64(amd64)
docker buildx build -t 镜像名:版本号-amd64 --platform linux/amd64 . --load
  • 1
  • 2
  • 3
  • 4
  • 5

导出本地tar文件

#导出tar文件
docker save -o 镜像名.TAG.tar 镜像名:TAG

导出tar.gz压缩文件

docker save 镜像名:TAG|gzip > 镜像名.TAG.tar.gz

  • 1
  • 2
  • 3
  • 4
  • 5

推送到仓库

docker tag  镜像名:TAG 镜像仓库地址/镜像名:TAG
docker push 镜像仓库地址/镜像名:TAG 
  • 1
  • 2

参考

https://docs.docker.com/build/building/multi-platform/
https://blog.csdn.net/qq_34777982/article/details/123515396
https://blog.csdn.net/qq_33745102/article/details/124714360
https://blog.csdn.net/u012586326/article/details/125589644
https://docs.docker.com/build/buildkit/configure/

另:

同时构建X86_64与ARM64镜像(支持list)

制作多平台基础镜像方式2:也可用于制作基础镜像,Dockerfile一致

docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/amd64,linux/arm64 . --push
  • 1

仓库支持https,则直接创建构建器,不需要配置

docker buildx create --name builderx  --driver docker-container  #创建name=buildx的构建器
docker buildx use builderx                                       #使用name=buildx的构造器,ls会出现*号表示正在使用中
docker buildx inspect builderx --bootstrap                       #启动name=builderx默认构造器
docker buildx ls                                                 #列出所有的构造器和支持的平台
docker buildx stop builderx                                      #停止name=buildx的构建器
  • 1
  • 2
  • 3
  • 4
  • 5

使用http非安全构造器方式2:待修正补充

不需要创建配置文件:–config /etc/buildkitd.toml
但不能使用–push的操作,只能使用–load;
https://docs.docker.com/engine/reference/commandline/buildx_build/#allow

#创建构造器:加--buildkitd-flags '--allow-insecure-entitlement security.insecure' 
 docker buildx create --use \
  --name mybuilder \
  --driver docker-container \
  --buildkitd-flags '--allow-insecure-entitlement security.insecure'  --use default

生成镜像:加--allow security.insecure

docker buildx build --allow security.insecure -t /ubuntu_buildx:v2.2 --platform linux/arm64 . --load

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
文章知识点与官方知识档案匹配,可进一步学习相关知识

与[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像相似的内容:

[转帖]docker使用buildx构建多平台(x86,arm64)构架镜像

https://blog.csdn.net/atzqtzq/article/details/128583331 配置文件激活buildx docker目前使用版本为Server Version: 20.10.7,添加配置支持buildx docker版本较低时,请升级docker版本 $ vim /

[转帖]docker使用阿里镜像源

ps:docker使用阿里镜像源特别快 首先安装docker:参考https://www.jianshu.com/p/2dae7b13ce2f 一.使用阿里镜像地址: dockerd --registry-mirror=https://lcmbw9im.mirror.aliyuncs.com 如果执

[转帖]Docker容器无法访问网络问题(网段冲突)

近日在使用docker在腾讯云服务器上部署项目 运行容器时死活访问不了网络,不论是外网还是内网。 最后找到原因是docker容器ip网段与服务器内网ip网段冲突导致的 使用此命令查看到 ifconfig 1 可以看到ip段冲突了 咱们重建docker的ip段 首先删除docker的网卡docker0

[转帖]Docker如何镜像加速

https://www.zhoubotong.site/post/69.html 在使用Docker 下载镜像时,如果不配置镜像加速,下载镜像会比较慢,因为国内从 DockerHub 拉取镜像有时会遇到困难, 此时我们可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例

[转帖]Docker Centos 支持中文字符集编码

https://www.jianshu.com/p/ac267eac47d1 我们在使用 Docker centos7.2 镜像时发现即使安装了中文字符集环境包,通过下面的命令来实现支持中文,但是在用 yum 安装某些软件后,比如执行 yum -y reinstall glibc glibc-com

[转帖]docker报错:报错br-xxxx 之Docker-Compose 自动创建的网桥与局域网络冲突

https://www.dianjilingqu.com/653590.html 故障描述: 当我使用docker-compose的方式部署内网的harbor时。它自动创建了一个bridge网桥,与内网的一个网段(172.18.0.1/16)发生冲突,docker 默认的网络模式是bridge ,默

[转帖]Docker-Compose 自动创建的网桥与局域网冲突解决方案

https://zhuanlan.zhihu.com/p/379305319 Docker-Compose 自动创建的网桥与局域网冲突解决方案 当我使用docker-compose的方式部署内网的harbor时。它自动创建了一个bridge网桥,与内网的一个网段(172.18.0.1/16)发生冲突

[转帖]docker安装ntp服务器并校时

https://www.javaclub.cn/server/61611.html 内网环境下,几台机器可能出现时间不一致的情况,导致数据时间不一致。使用docker安装ntp服务器简单快捷、不依赖具体操作系统环境。 1.安装命令: docker run -d --net=host --cap-ad

[转帖]使用docker安装redis、启动并设置密码

https://www.cnblogs.com/goloving/p/15087357.html 一、docker 安装 redis 步骤 1、找一个合适的 redis 版本 —— 目前推荐的稳定版是 5.0 2、使用 docker 安装 redis docker pull redis:5.0 do

[转帖]使用docker快速构建RabbitMQ

https://www.cnblogs.com/shanfeng1000/p/16261011.html 有时间,我们需要rabbitmq测试一下,如果按照原方案部署一个rabbitmq,比较麻烦,这个时候可以使用docker快速构建一个rabbitmq来使用。 rabbitmq:managemen