构建多架构镜像

搭建本地镜像仓库

docker run -d --name registry -p 5000:5000 registry

配置域名解析

修改/etc/hosts

172.20.16.185  local-registry

设置可信仓库

本地为http,需要配置

# cat /etc/docker/daemon.json 
{
    "insecure-registries" : ["local-registry:5000"]
}

从dockerhub拉取测试镜像

因本地为x86环境,默认是拉取不到arm64架构的镜像的,需要指定--platform参数

docker pull --platform arm64 python:3.9.6-alpine3.13
// 为了后续push到镜像仓库,也防止与amd架构镜像名冲突
docker tag python:3.9.6-alpine3.13 local-registry:5000/python:3.9.6-alpine3.13-arm64
// 本地为x86,可不加--platform参数
docker pull --platform amd64 python:3.9.6-alpine3.13
docker tag python:3.9.6-alpine3.13 local-registry:5000/python:3.9.6-alpine3.13-amd64

推送镜像到镜像仓库

必须要有这一步,创建多架构镜像时是从镜像仓库拉取镜像,不是从本地

docker push local-registry:5000/python:3.9.6-alpine3.13-arm64
docker push local-registry:5000/python:3.9.6-alpine3.13-amd64

创建多架构镜像

http仓库,因此需要加上--insecure参数

docker manifest create --insecure local-registry:5000/python:3.9.6-alpine3.13 local-registry:5000/python:3.9.6-alpine3.13-arm64 local-registry:5000/python:3.9.6-alpine3.13-amd64

Created manifest list local-registry:5000/python:3.9.6-alpine3.13

查看多架构镜像

docker manifest inspect local-registry:5000/python:3.9.6-alpine3.13

{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1368,
         "digest": "sha256:2218325573351688f74a604f67e643f26bf7851c92d65849077d023516bd629f",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1368,
         "digest": "sha256:19256666830f70a3621ac44fa32e1a09f40be3ef168d86329891569fcecdefd4",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      }
   ]
}

推送多架构镜像到镜像仓库

以后pull该镜像时,机器架构是什么,就会自动拉取当前架构的镜像

docker manifest push --insecure local-registry:5000/python:3.9.6-alpine3.13

删除本地多架构镜像

docker manifest rm local-registry:5000/python:3.9.6-alpine3.13

其他事项

前面已经推送到镜像仓库的xxx-arm64的镜像或者xxx-amd64的镜像可以不用管,镜像都是复用的,并不会占用存储空间,只是多了个tag,如果非要删的话,本地镜像仓库怎么去删除tag我没去看,如果是使用的harbor,直接去页面删除tag即可

一键化脚本

#!/bin/bash

# example:
# bash build.sh registry.example.org/xx/xxx quay.io/jetstack/cert-manager-controller:v1.11.0 cert-manager-controller:v1.11.0

# 要推送到的仓库
repo=$1
# 原镜像,包含仓库url
image=$2
# 目标镜像, 不包含仓库url
pure_image=$3

docker pull $image --platform amd64
docker tag $image $repo/amd64/$pure_image
docker push $repo/amd64/$pure_image

docker pull $image --platform arm64
docker tag $image $repo/arm64/$pure_image
docker push $repo/arm64/$pure_image

docker manifest create $repo/$pure_image $repo/amd64/$pure_image $repo/arm64/$pure_image
docker manifest push $repo/$pure_image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值