Docker是一個(gè)開源的容器化平臺(tái),它可以讓開發(fā)者打包應(yīng)用程序及其依賴項(xiàng)到一個(gè)容器中,并在任何地方運(yùn)行這個(gè)容器,而不用擔(dān)心環(huán)境配置的問題。類比一下,就好像打包一個(gè)包裹,里面包含了應(yīng)用程序和它需要的各種工具、庫等等,這個(gè)包裹可以在不同的地方被運(yùn)輸和打開,而不需要在每個(gè)地方重新裝一遍工具和庫。這樣,Docker可以使我們的應(yīng)用程序更加容易部署、更加可移植,并且可以提高開發(fā)效率。
而DockerHub則是一個(gè)公共官方的包裹存儲(chǔ)庫,也是我們使用docker pull命令時(shí)默認(rèn)的下載倉庫。在這個(gè)存儲(chǔ)庫中,有官方或個(gè)人所上傳的不同版本,不同架構(gòu)的鏡像。本次我們介紹的則是,如何在DockerHub網(wǎng)站下載官方arm架構(gòu)的鏡像。
如何使用Dokcer Hub?
以u(píng)buntu鏡像為例,當(dāng)我們登錄hub.docker.com后在搜索框內(nèi)輸入ubuntu。之后便會(huì)出來很多以
“鏡像名字”/”作者或鏡像內(nèi)容”:”版本”(也許會(huì)有版本)
為標(biāo)題的鏡像。當(dāng)然這只是個(gè)命名的方式,也有很多不同于這個(gè)格式的鏡像。此時(shí)第一個(gè)標(biāo)有OFFICIAL(官方)的鏡像往往也是我們想找的,因?yàn)楣俜界R像有足夠詳細(xì)的文檔、支持不同的版本與架構(gòu),可以滿足大多數(shù)要求。其中當(dāng)然也不乏有第三方作者制作精良的鏡像,它們往往省心省力。
回到正題,進(jìn)入到ubuntu官方鏡像的詳情頁。我們可以看到映入眼簾的則是他的介紹、版本等。在左上角則是官方提供的下載命令(此命令未指定版本等信息)。
點(diǎn)擊Tags選項(xiàng)卡,可以看到這是ubuntu鏡像發(fā)布過的版本信息??梢赃M(jìn)行篩選及搜索。latest標(biāo)簽則為最新版本的鏡像,我們也可以看到有多個(gè)它所支持的OS(系統(tǒng))/ARCH(架構(gòu))。右側(cè)則有下載此版本鏡像的命令,以及鏡像的大小。而左側(cè)則有每個(gè)鏡像摘要值,這個(gè)值是唯一的。
如何在X86_64架構(gòu)的主機(jī)上下載arm架構(gòu)鏡像?
計(jì)算機(jī)的CPU有不同的品牌如intel、amd等這些耳熟能詳?shù)摹K鼈兓镜募軜?gòu)都為X86,這個(gè)架構(gòu)早期有intel制定,后續(xù)由amd進(jìn)行擴(kuò)展為當(dāng)今主流的X86_64又名amd64。主流并非唯一,業(yè)界一直存在多種 CPU 架構(gòu),如arm架構(gòu)。許多手機(jī)的CPU也都是arm64架構(gòu)以及大名鼎鼎得Mac的M1、M2均是arm64架構(gòu)。Linux很早就開始支持arm64架構(gòu),其社區(qū)名為aarch64。在如今我們的科技被美國制裁。華為自研arm架構(gòu)的手機(jī)及服務(wù)器芯片也均已停產(chǎn),國家要邁向全國產(chǎn)的道路。而當(dāng)下國產(chǎn)CPU多半使用的均為arm架構(gòu),甚至當(dāng)下都無法獲得armv8/v9版本的授權(quán),但是arm架構(gòu)還是會(huì)慢慢的走進(jìn)大家的視野內(nèi)的。
前面扯得有點(diǎn)遠(yuǎn),所以我們?cè)撊绾螐腦86_64架構(gòu)的主機(jī)上下載arm架構(gòu)的鏡像呢?說到這就不得不提鏡像是怎么區(qū)分CPU架構(gòu)的了。
鏡像命名區(qū)分CPU架構(gòu)
CPU 構(gòu)架 “規(guī)范” 名稱
我們可以看到早期或者現(xiàn)在,也有不同架構(gòu)的鏡像添加 CPU 架構(gòu)名作為鏡像命名空間前綴。這樣就可以用不同的名字下載不同架構(gòu)的鏡像了。
docker pull amd64/ubuntu:20.04
docker pull arm64v8/ubuntu:20.04
# 其實(shí)現(xiàn)在你也能pull到。
這個(gè)方法所帶來的問題則很多,如CPU 構(gòu)架 “規(guī)范” 名稱該怎么命名?為什么x86_64不命名為amd64?arm64不命名為aarch64?
使用 Tag 后綴區(qū)分構(gòu)架
解決方法則是使用 Tag 后綴區(qū)分構(gòu)架,變通辦法是不使用命名空間前綴,改為使用鏡像名或 Tag 前綴或后綴區(qū)分。如:
docker pull ubuntu:20.04-x86_64
docker pull ubuntu:20.04-aarch64
在此情況下,我們可以直接使用docker pull 鏡像名:版本@摘要值 的方式進(jìn)行下載指定的鏡像。
如我們要下載armv7版本的ubuntu鏡像,可以直接點(diǎn)擊左側(cè)的摘要值進(jìn)入鏡像的詳細(xì)頁面。
在鏡像名稱下方則是我需要的摘要值,它是此鏡像的唯一值。再下面我們可以選擇不同的版本進(jìn)行查看。左下方的則是構(gòu)建此鏡像的層,Dockerfile構(gòu)建過程。而右下方則顯示了鏡像中包含的軟件包,軟件是否安全,是否有漏洞等。
現(xiàn)在可以使用當(dāng)前命令進(jìn)行下載指定版本的鏡像。
docker pull ubuntu:latest@sha256:ad18cfdb19dac67bf0072dacea661a817330e5c955d081f4d09914e743ae5d4a
使用此命令查看鏡像支持的架構(gòu)。
docker inspect ubuntu:latest@sha256:ad18cfdb19dac67bf0072dacea661a817330e5c955d081f4d09914e743ae5d4a
# ---
"Architecture": "arm",
"Variant": "v7",
"Os": "linux",
"Size": 55339361,
"VirtualSize": 55339361,
清單列表(Manifest List) 支持多構(gòu)架鏡像,進(jìn)行拉取arm架構(gòu)鏡像
容器社區(qū)提出了使用統(tǒng)一的鏡像名支持多種 CPU 構(gòu)架的方案。2017-09-12 后, docker 使用清單列表 (Manifest List) 功能實(shí)現(xiàn)了這一方案。當(dāng)有了這一功能,我們可以基于一個(gè)鏡像命名空間。當(dāng)使用docker pull 進(jìn)行拉取鏡像時(shí),docker會(huì)根據(jù)當(dāng)前CPU架構(gòu)拉取對(duì)應(yīng)的鏡像。
docker pull ubuntu:20.04
當(dāng)我們需要跨CPU架構(gòu)拉取鏡像時(shí),如我是一個(gè)X86主機(jī),想要拉取一個(gè)arm架構(gòu)的鏡像,除了剛才提到的方法。docker為我們提供了pull命令中的--platform參數(shù),此參數(shù)可以明確指定我們需要的鏡像。platform 不僅可指定 CPU 構(gòu)架信息,還可以指定操作系統(tǒng)信息。
前面提到,鏡像可以通過鏡像命名空間中加入架構(gòu)名稱來區(qū)分鏡像的架構(gòu)。但帶來的問題則是,不同的人可能命名規(guī)范并不相同,難以統(tǒng)一?,F(xiàn)在使用清單列表的鏡像在向docker鏡像中心進(jìn)行注冊(cè)時(shí)必須按照其規(guī)范進(jìn)行命名。但 platform 參數(shù)使用任意一個(gè)慣用名均可。如其注冊(cè)名為arm/v7 ,而在使用platfrom參數(shù)時(shí),指定為arm即可。
多架構(gòu)與單架構(gòu)拉取的鏡像為同一個(gè)。
# 拉取 amd64 命名空間下的單架構(gòu)鏡像
docker image pull amd64/ubuntu:20.04
# 拉取多架構(gòu)鏡像在 x86_64 構(gòu)架下的鏡像
docker image pull --platform x86_64 ubuntu:20.04
創(chuàng)建多構(gòu)架鏡像
docker 使用清單列表 (Manifest List) 支持多構(gòu)架鏡像。
什么是清單?
將一個(gè) docker 鏡像推送到鏡像注冊(cè)中心后,鏡像注冊(cè)中心會(huì)記錄鏡像的存儲(chǔ)信息,稱為鏡像清單 (Image Manifest) 。而清單列表則記錄了多個(gè)鏡像清單及其對(duì)應(yīng)的平臺(tái) platform 信息。所謂多構(gòu)架鏡像,或多平臺(tái)鏡像,就是清單列表及其關(guān)聯(lián)的多個(gè)單構(gòu)架鏡像。
創(chuàng)建多構(gòu)架 (多平臺(tái)) 鏡像的操作步驟為:
創(chuàng)建多個(gè)單構(gòu)架鏡像。
將所有鏡像推送到鏡像注冊(cè)中心,自動(dòng)生成鏡像清單。
匯總多個(gè)鏡像清單得到清單列表,同樣將清單列表推送 (存儲(chǔ)) 到鏡像注冊(cè)中心上。新版本 docker 可使用 docker manifest 命令創(chuàng)建和推送清單列表。
Linux 支持交叉構(gòu)建,即在一套環(huán)境下構(gòu)建多種 CPU 構(gòu)架下的鏡像。為了簡單起見,暫不討論這種方案,暫采用在多個(gè)構(gòu)架環(huán)境下創(chuàng)建各自的原生鏡像的辦法。
這里以創(chuàng)建多架構(gòu)鏡像 test/ubuntu:20.04 為例,介紹創(chuàng)建 docker 多構(gòu)架鏡像的實(shí)踐操作步驟。
基于官方多架構(gòu)鏡像 ubuntu:20.04 編寫 Dockerfile 。
在 x86_64 機(jī)器上構(gòu)建原生鏡像,推送到鏡像注冊(cè)中心。docker build --pull 表示每次構(gòu)建前自動(dòng)拉取最新的基礎(chǔ)鏡像,基礎(chǔ)鏡像是多架構(gòu)鏡像 (清單列表) 時(shí),自動(dòng)更新到當(dāng)前架構(gòu)的最新鏡像。
docker build --pull -t test/ubuntu:20.04-x86_64 .
docker push test/ubuntu:20.04-x86_64
同樣,在 arm64 機(jī)器上構(gòu)建原生鏡像,推送到鏡像注冊(cè)中心。
docker build --pull -t test/ubuntu:20.04-aarch64 .
docker push test/ubuntu:20.04-aarch64
使用推送到鏡像注冊(cè)中心的多個(gè)鏡像創(chuàng)建清單列表。注意,前面為每個(gè)單架構(gòu)鏡像添加了不同的 Tag 后綴,以方便區(qū)分引用。將清單列表推送到鏡像注冊(cè)中心,刪除本地副本 (清單列表只有存儲(chǔ)在鏡像注冊(cè)中心上才有意義) 。
docker manifest create test/ubuntu:20.04 hanyong/ubuntu:20.04-x86_64 hanyong/ubuntu:20.04-aarch64
docker manifest push test/ubuntu:20.04
docker manifest rm test/ubuntu:20.04
擴(kuò)展:
docker pull 鏡像存儲(chǔ)位置在哪?
查看docker鏡像默認(rèn)存儲(chǔ)位置:
根據(jù) Docker Root Dir: /var/lib/docker顯示/var/lib/docker為默認(rèn)存儲(chǔ)位置。
docker info
#---
Kernel Version: 5.4.0-26-generic
Operating System: Ubuntu 20.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.748GiB
Name: weijishu
ID: LINI:YJJ3:WDYH:CFFN:5DBN:WM52:B57J:E6IP:VF7D:NLCV:XJR2:GF62
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
總結(jié)
本文介紹了如何在x86_64架構(gòu)的主機(jī)上下載arm架構(gòu)的鏡像。鏡像可以通過鏡像命名空間中加入架構(gòu)名稱來區(qū)分鏡像的架構(gòu),也可以使用Tag后綴區(qū)分構(gòu)架。此外,docker使用清單列表支持多構(gòu)架鏡像,可以使用–platform參數(shù)指定需要的鏡像。本文還介紹了如何創(chuàng)建多構(gòu)架鏡像。文章來源:http://www.zghlxwxcb.cn/news/detail-797894.html
???歡迎關(guān)注???文章來源地址http://www.zghlxwxcb.cn/news/detail-797894.html
到了這里,關(guān)于Docker如何跨平臺(tái)下載Arm架構(gòu)的鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!