docker實(shí)現(xiàn)buildx構(gòu)建多平臺(x86,arm64)構(gòu)架鏡像
配置文件激活buildx
docker目前使用版本為Server Version: 20.10.7,添加配置支持buildx
- docker版本較低時,請升級docker版本
$ vim /etc/docker/daemon.json{ "experimental": true}有部分docker未帶有,比如arm版本,則需要單獨(dú)下載文件:
下載對應(yīng)版本:https://github.com/docker/buildx/releases/tag/v0.8.2mkdir -p ~/.docker/cli-pluginsmv buildx-v0.8.2.linux-arm64 ~/.docker/cli-plugins/docker-buildxchmod +x ~/.docker/cli-plugins/docker-buildxdocker buildx ls # 驗(yàn)證是否安裝成功
重啟docker
#驗(yàn)證buildx版本docker buildx version#重啟docker ***systemctl restart docker#檢查是否啟用docker info|grep Experimental
環(huán)境準(zhǔn)備(需要聯(lián)網(wǎng))
系統(tǒng)環(huán)境要求
- 如果版本較低,需要升級內(nèi)核
uname -a #內(nèi)核版本要求4.8+
安裝binfmt,支持的平臺
安裝編譯時需要支持的平臺,這里選擇所有
- binfmt-support >= 2.1.7,需要聯(lián)網(wǎng)docker-hub
docker run --privileged --rm tonistiigi/binfmt --install all
初始化buildx構(gòu)造器(不需要倉庫https)
1.創(chuàng)建name=mybuilder且自定義配置的構(gòu)造器
docker buildx create --use \--name mybuilder \--driver docker-container \--config /etc/buildkitd.toml --use default
2.其中自定義配置內(nèi)容
!!!【修改配置后,要刪除舊的,重新創(chuàng)建構(gòu)造器】!!!
$ vi /etc/buildkitd.tomldebug = 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
啟動構(gòu)建器,會自動下載并啟動buildx_buildkit_mybuilder0 的容器,需要聯(lián)網(wǎng)docker-hub
docker buildx inspect mybuilder --bootstrap #啟動name=mybuilder默認(rèn)構(gòu)造器docker buildx ls #列出所有的構(gòu)造器和支持的平臺docker buildx use mybuilder #使用name=buildx的構(gòu)造器,ls會出現(xiàn)*號表示正在使用中 docker buildx stop mybuilder #停止name=buildx的構(gòu)建器
制作多平臺基礎(chǔ)鏡像方式1:合并(docker manifest)
【可用docker buildx imagetools代替】
檢查是否啟用Experimental
docker info|grep Experimental #如果未啟動,則需要配置,詳見最頂端docker manifest --help
顯示添加harbor-registry的80端口的配置
因?yàn)閮?nèi)網(wǎng)環(huán)境,未使用https,而且docker很多地方未完全實(shí)現(xiàn)兼容默認(rèn)去掉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創(chuàng)建多鏡像集合
docker manifest create --insecure 192.168.69.150:80/commandcenter/centos_arm:latest \ 192.168.69.150:80/commandcenter/centos_arm:v1
- –insecure,允許不安全的服務(wù)
- 192.168.69.150:80/commandcenter/centos_arm:lates,第一個鏡像名為統(tǒng)一的名稱
- 192.168.69.150:80/commandcenter/centos_arm:v1,后面的表示要集成的子鏡像名,當(dāng)然可以集成多個子鏡像
- 刪除使用docker manifest rm 【manifest統(tǒng)一鏡像名稱】
修改子鏡像的架構(gòu)名稱(可選)
當(dāng)有部分默認(rèn)的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
指定v1版本為linux下的arm64架構(gòu)
推送多鏡像集合
docker manifest push --insecure 192.168.69.150:80/commandcenter/centos_arm:latest
–insecure,允許不安全的服務(wù)
檢查是否正常
進(jìn)入harbor,檢查鏡像是否有【文件夾】的圖標(biāo),點(diǎn)擊進(jìn)入是否有OS/ARCH的列
拉取測試
此處命令兼容80端口,所以可省略docker pull --platform=linux/arm64/v8 192.168.69.150/commandcenter/centos_arm:latest
使用buildx時,指定platform則使用OS/ARCH的列值
查看已有鏡像的manifest
docker manifest inspect --insecure 192.168.69.150:80/commandcenter/centos_arm:latest
調(diào)整Dockerfile接收平臺相關(guān)參數(shù)(可選,建議不寫)
# 顯示指定buildx傳遞--platform,但建議不寫,在buildx后面?zhèn)鬟fplatform參數(shù)即可,這樣可兼容一般build命令 FROM --platform=$TARGETPLATFORM 基礎(chǔ)鏡像名:TAG
構(gòu)建并導(dǎo)出到本地Docker images中
Dockfile中使用到的基礎(chǔ)鏡像需要支持多平臺架構(gòu),如下harbor顯示
一個鏡像的同一個tag下,點(diǎn)擊文件夾后,進(jìn)入多平臺架構(gòu)列表;
| Artifacts | 拉取命令 | OS/ARCH | Tags | 大小 |
|---|---|---|---|---|
| sha256:c238d03b【有個文件夾】 | linux/amd64 | 117.57MiB | ||
| sha256:74842b33 | linux/arm64 | 121.57MiB |
# 導(dǎo)出到本地只能構(gòu)建一個鏡像,本地不支持同時導(dǎo)出manifest lists#arm64docker buildx build -t 鏡像名:版本號-arm64 --platform linux/arm64 . --load#x86_64(amd64)docker buildx build -t 鏡像名:版本號-amd64 --platform linux/amd64 . --load
導(dǎo)出本地tar文件
#導(dǎo)出tar文件docker save -o 鏡像名.TAG.tar 鏡像名:TAG#導(dǎo)出tar.gz壓縮文件docker save 鏡像名:TAG|gzip > 鏡像名.TAG.tar.gz
推送到倉庫
docker tag 鏡像名:TAG 鏡像倉庫地址/鏡像名:TAGdocker push 鏡像倉庫地址/鏡像名:TAG
另:
同時構(gòu)建X86_64與ARM64鏡像(支持list)
制作多平臺基礎(chǔ)鏡像方式2:也可用于制作基礎(chǔ)鏡像,Dockerfile一致
docker buildx build -t 鏡像倉庫地址/鏡像名:TAG --platform linux/amd64,linux/arm64 . --push
倉庫支持https,則直接創(chuàng)建構(gòu)建器,不需要配置
docker buildx create --name builderx --driver docker-container #創(chuàng)建name=buildx的構(gòu)建器 docker buildx use builderx #使用name=buildx的構(gòu)造器,ls會出現(xiàn)*號表示正在使用中 docker buildx inspect builderx --bootstrap #啟動name=builderx默認(rèn)構(gòu)造器 docker buildx ls #列出所有的構(gòu)造器和支持的平臺 docker buildx stop builderx #停止name=buildx的構(gòu)建器
使用http非安全構(gòu)造器方式2:待修正補(bǔ)充
不需要創(chuàng)建配置文件:–config /etc/buildkitd.toml
但不能使用–push的操作,只能使用–load;
https://docs.docker.com/engine/reference/commandline/buildx_build/#allow
#創(chuàng)建構(gòu)造器:加--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
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Docker+jenkins+python3環(huán)境搭建超詳細(xì)教程
這篇文章主要介紹了使用Docker+jenkins+python3環(huán)境搭建超詳細(xì)教程,本文通過多種方法結(jié)合示例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2021-07-07
cordon節(jié)點(diǎn)drain驅(qū)逐節(jié)點(diǎn)delete節(jié)點(diǎn)詳解
這篇文章主要為大家介紹了cordon節(jié)點(diǎn)drain驅(qū)逐節(jié)點(diǎn)delete節(jié)點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
基于docker部署skywalking實(shí)現(xiàn)全鏈路監(jiān)控功能
這篇文章主要介紹了基于docker部署skywalking實(shí)現(xiàn)全鏈路監(jiān)控,skywalking提供了在很多不同的場景下用于觀察和監(jiān)控分布式系統(tǒng)的方式,文中給大家介紹如何快速部署skywalking全鏈路監(jiān)控,感興趣的朋友一起看看吧2022-03-03
解決docker run后容器出現(xiàn)Exited (0)情況的問題
這篇文章主要介紹了解決docker run后容器出現(xiàn)Exited (0)情況的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Docker中Compose與Kubernetes的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Docker中Compose與Kubernetes區(qū)別的相關(guān)資料,Docker Compose和Kubernetes(簡稱k8s)都是容器編排工具,需要的朋友可以參考下2023-08-08
Docker+Nginx+KeepaLived實(shí)現(xiàn)Nginx一主一從高可用方式
在CentOS7主從服務(wù)器上部署Nginx容器并配置Keepalived實(shí)現(xiàn)高可用,通過虛擬IP自動切換,主從均需安裝Keepalived,配置健康檢查腳本監(jiān)控Nginx狀態(tài),故障時自動重啟或切換虛擬IP,需關(guān)閉防火墻和SELinux,并確保腳本有執(zhí)行權(quán)限2025-07-07
docker覆蓋鏡像默認(rèn)命令之docker?entrypoint詳解
entrypoint命令就是覆蓋ENTRYPOINT命令的,本文給大家介紹了docker覆蓋鏡像默認(rèn)命令之docker?entrypoint的相關(guān)知識,需要的朋友可以參考下2023-10-10

