docker版本较低时,请升级docker版本
$ vim /etc/docker/daemon.json
{
"experimental": true
}
#验证buildx版本
docker buildx version
#重启docker ***
systemctl restart docker
#检查是否启用
docker info|grep Experimental
如果版本较低,需要升级内核
uname -a #内核版本要求4.8+
binfmt-support >= 2.1.7,需要联网docker-hub
docker run --privileged --rm tonistiigi/binfmt --install all
1.创建name=mybuilder且自定义配置的构造器
docker buildx create --use \
--name mybuilder \
--driver docker-container \
--config /etc/buildkitd.toml --use default
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.31.189"]
http = true
insecure = true
[registry."192.168.31.189:80"]
http = true
insecure = true
docker buildx inspect mybuilder --bootstrap #启动name=mybuilder默认构造器
docker buildx ls #列出所有的构造器和支持的平台
docker buildx use builderx #使用name=buildx的构造器,ls会出现*号表示正在使用中
【可用docker buildx imagetools代替】
docker info|grep Experimental #如果未启动,则需要配置,详见最顶端
docker manifest --help
因为内网环境,未使用https,而且docker很多地方未完全实现兼容默认去掉80端口,
在以后的配置中最好是添加端口使用,避免不必要的坑。
$ vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.31.189:80","192.168.31.189"],
"registry-mirrors":["http://192.168.31.189:80","http://192.168.31.189"]
}
#重新登录
docker login 192.168.31.189:80
#重启docker ***
systemctl restart docker
docker manifest create --insecure 192.168.31.189:80/commandcenter/centos_arm:latest \
192.168.31.189:80/commandcenter/centos_arm:v1
docker manifest rm 【manifest统一镜像名称】
当有部分默认的os/arch值没有,或者太长时,可自定义修改
docker manifest annotate 192.168.31.189:80/commandcenter/centos_arm:latest \
192.168.31.189:80/commandcenter/centos_arm:v1 \
--os linux --arch arm64
docker manifest push --insecure 192.168.31.189:80/commandcenter/centos_arm:latest
此处命令兼容80端口,所以可省略
docker pull --platform=linux/arm64/v8 192.168.31.189/commandcenter/centos_arm:latest
docker manifest inspect --insecure 192.168.31.189:80/commandcenter/centos_arm:latest
# 显示指定buildx传递--platform,但建议不写,在buildx后面传递platform参数即可,这样可兼容一般build命令
FROM --platform=$TARGETPLATFORM 基础镜像名:TAG
Dockfile中使用到的基础镜像需要支持多平台架构,如下harbor显示
一个镜像的同一个tag下,点击文件夹后,进入多平台架构列表;
Artifacts | 拉取命令 | OS/ARCH | Tags | 大小 |
---|---|---|---|---|
sha256:c238d03b【有个文件夹】 | linux/amd64 | 117.57MiB | ||
sha256:74842b33 | linux/arm64 | 121.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
#导出tar文件
docker save -o 镜像名.TAG.tar 镜像名:TAG
#导出tar.gz压缩文件
docker save 镜像名:TAG|gzip > 镜像名.TAG.tar.gz
docker tag 镜像名:TAG 镜像仓库地址/镜像名:TAG
docker push 镜像仓库地址/镜像名:TAG
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/
制作多平台基础镜像方式2:也可用于制作基础镜像,Dockerfile一致
docker buildx build -t 镜像仓库地址/镜像名:TAG --platform linux/amd64,linux/arm64 . --push
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 #列出所有的构造器和支持的平台
不需要创建配置文件:–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