搭建本地镜像仓库
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