Docker buildx構(gòu)建多平臺(tái)鏡像并推送到私有倉庫的方法
引子
最近發(fā)現(xiàn)有ARM版Docker,hub.docker.com上也有ARM版本的鏡像,但是ARM版本的Docker鏡像構(gòu)建是個(gè)問題。嵌入式程序可以在PC機(jī)上進(jìn)行交叉編譯,不知道Docker是否有交叉構(gòu)建的方案。
方案
目前想到的Docker構(gòu)建ARM鏡像方法有如下幾種。第三種就類似交叉編譯。
- 使用ARM主機(jī),安裝ARM版本的Docker,docker build出來的就是ARM版本的鏡像。
- 使用Linux的虛擬化軟件,模擬ARM芯片+ Linux,例如qemu。
- 使用Docker試驗(yàn)功能buildx,可以構(gòu)建多平臺(tái)的鏡像。
使用Docker buildx構(gòu)建多個(gè)平臺(tái)鏡像
參考如下幾個(gè)鏈接。
https://docs.docker.com/engine/reference/commandline/manifest/
https://docs.docker.com/buildx/working-with-buildx/
https://engineering.docker.com/2019/06/getting-started-with-docker-for-arm-on-linux/
用到了兩個(gè)docker的試驗(yàn)功能,使用時(shí)需要開啟試驗(yàn)功能。
docker manifest,manifest是一個(gè)包含了鏡像信息的文件。manifest list是一個(gè)鏡像清單列表,用于存放不同os/arch的鏡像信息。我們可以創(chuàng)建一個(gè)manifest list來指向兩個(gè)鏡像,然后可以支持多平臺(tái)。
docker buildx,buildx是docker的一個(gè)插件,是下一代docker鏡像構(gòu)建。該插件通過qemu-user-static翻譯不同平臺(tái)的指令集,達(dá)到在x64上運(yùn)行其他平臺(tái)的程序。buildx實(shí)際使用了moby/buildkit:buildx-stable-1鏡像進(jìn)行多平臺(tái)構(gòu)建。
搭建docker registry多平臺(tái)版本
參考如下鏈接,構(gòu)建docker registry鏡像。
https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/deploying-multi-architecture-docker-registry
搭建dns服務(wù)器,解決buildx bug
buildx插件不走本地hosts文件,必須走dns。這是個(gè)bug,https://github.com/docker/buildx/issues/218,社區(qū)也沒人管。
解決方法:自建dns,把鏡像的地址buildx.com指向registry的機(jī)器,后續(xù)用nginx。ubuntu有一個(gè)默認(rèn)systemd-resolved,關(guān)閉之后在開啟dnsmasq。
使用nginx代理解決命名問題
增加nginx代理同時(shí)支持HTTP和HTTPS。buildx這個(gè)插件強(qiáng)行使用了HTTPS,沒有找到關(guān)閉的地方。
提示證書問題,證書不是這個(gè)域名的,解決方法: 重新生成一個(gè)證書,域名填自己的。
證書問題,不信任自簽名證書,把自簽名的證書加到buildx daemon容器的證書信任鏈中。https://github.com/docker/buildx/issues/80#issuecomment-533844117
nginx增加兩個(gè)配置,解決客戶端push時(shí)的幾個(gè)問題。
# nignx.conf 配置 proxy_ignore_client_abort on; #忽略客戶端告警 client_max_body_size 0; #上傳文件大小不限制 # 虛擬主機(jī)配置 server { listen 443; server_name buildx.com; ssl on; ssl_certificate crt/server.crt; ssl_certificate_key crt/server.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照這個(gè)協(xié)議配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照這個(gè)套件配置 ssl_prefer_server_ciphers on; location / { proxy_pass http://192.168.1.11:81; } } server { listen 80; server_name buildx.com; location / { proxy_pass http://192.168.1.11:81; } }
設(shè)置本地Docker環(huán)境
本地Docker需要開啟實(shí)驗(yàn)功能。
- 在/etc/docker/daemon.json中配置 "experimental": true,重啟Docker。開啟Docker daemon的實(shí)驗(yàn)功能。
- 在本地執(zhí)行export DOCKER_CLI_EXPERIMENTAL=enabled,開啟Docker Client的實(shí)驗(yàn)功能。
- 使用docker version查看實(shí)驗(yàn)功能是否開啟。
- 執(zhí)行docker run --rm --privileged docker/binfmt:820fdd95a9972a5308930a2bdfb8573dd4447ad3,開啟內(nèi)核binfmt_misc功能,可以在當(dāng)前平臺(tái)上執(zhí)行多平臺(tái)的程序。
- 查看是否支持aarch64程序。cat /proc/sys/fs/binfmt_misc/qemu-aarch64
- 此時(shí)本地的docker可以運(yùn)行各種平臺(tái)的docker容器。比如arm64??梢允褂萌缦旅顪y(cè)試。
# 拉取arm64版本鏡像并運(yùn)行 docker pull --platform arm64 alpine:3.10 docker run --rm -it alpine:3.10 sh
制作基礎(chǔ)鏡像
可以從hub.docker.com中獲取多個(gè)平臺(tái)的版本,生成manifest list,上傳的registry中。
# pull arm64版本、改名、上傳。 具體鏡像是否支持多平臺(tái),可以到hub.docker.com上看。 docker pull --platform arm64 centos:7 docker tag centos:7 buildx.com/base/centos-arm64:7 docker push buildx.com/base/centos-arm64:7 # pull amd64版本、改名、上傳 docker pull --platform amd64 centos:7 docker tag centos:7 buildx.com/base/centos-amd64:7 docker push buildx.com/base/centos-amd64:7 # 創(chuàng)建manifest list、上傳。 docker manifest create --insecure buildx.com/base/centos:7 buildx.com/base/centos-amd64:7 buildx.com/base/centos-arm64:7 docker manifest push --insecure buildx.com/base/centos:7
構(gòu)建業(yè)務(wù)鏡像
# buildx 可以指定多個(gè)平臺(tái),但是要求Dockerfile中的FROM鏡像必須有對(duì)應(yīng)版本的。 # buildx 打包的鏡像不會(huì)在本地存儲(chǔ),加--push,上傳docker倉。或者可以使用--output指定輸出方式。 docker buildx build --platform linux/amd64,linux/arm64 -t buildx.com/base/java-base:openjdk-8-centos7 . --push
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署mysql遠(yuǎn)程連接 解決2003的問題
這篇文章主要介紹了Docker部署mysql遠(yuǎn)程連接 解決2003錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03docke自定義網(wǎng)絡(luò)之容器互聯(lián)
大家好,本篇文章主要講的是docke自定義網(wǎng)絡(luò)之容器互聯(lián),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12一文詳解如何在Ubuntu系統(tǒng)中安裝docker
這篇文章主要為大家詳細(xì)介紹了在Ubuntu操作系統(tǒng)上安裝Docker的步驟,以便我們可以開始使用Docker來構(gòu)建和運(yùn)行容器化應(yīng)用程序,希望對(duì)大家有所幫助2024-03-03SpringCloud基于Docker和Docker-Compose的項(xiàng)目部署過程
本文介紹了如何卸載舊版本Docker、更新系統(tǒng)、安裝Docker及其依賴,并設(shè)置國內(nèi)鏡像源以加快下載速度,詳細(xì)說明了如何安裝Docker Compose、配置鏡像加速器,并展示了如何使用Docker Compose部署SpringCloud項(xiàng)目,提供了更新和重啟容器的方法2024-10-10利用Dockerfile制作個(gè)人的鏡像文件詳細(xì)講解
Docker是一個(gè)開源的應(yīng)用容器引擎,Dockerfile是用來構(gòu)建Docker鏡像的構(gòu)建文件,是由一系列命令和參數(shù)構(gòu)成的腳本,本文將給大家詳細(xì)介紹如何利用Dockerfile制作個(gè)人的鏡像文件,感興趣的同學(xué)可以借鑒參考2023-06-06jenkins中通過Publish Over SSH插件將項(xiàng)目部署到遠(yuǎn)程機(jī)器上的講解說明
今天小編就為大家分享一篇關(guān)于jenkins中通過Publish Over SSH插件將項(xiàng)目部署到遠(yuǎn)程機(jī)器上的講解說明,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02docker創(chuàng)建并運(yùn)行一個(gè)MySql容器,并將宿主機(jī)直接掛載到容器
這篇文章主要介紹了docker創(chuàng)建并運(yùn)行一個(gè)MySql容器,并將宿主機(jī)直接掛載到容器問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09