分享者:王志昌,某知名互聯(lián)網(wǎng)企業(yè)資深工程師。主要是負責paas平臺建設,容器云的運維,較為擅長云計算以及容器技術(shù)。 1 容器鏡像OCI規(guī)范與鏡像倉庫 容器鏡像是分層結(jié)構(gòu),如下圖所示,都遵循開放容器計劃Open Container Initiative(OCI)的規(guī)范(請參考https://github.com/opencontainers/image-spec),使在不同的容器運行時環(huán)境中構(gòu)建的容器鏡像可以自由地分發(fā)到其它的容器運行時,如,containerd、cri-o、podman,在其中正常運行,而不會有兼容性的問題。 容器鏡像倉庫做為企業(yè)的應用系統(tǒng)容器的資產(chǎn)倉庫,同樣需要兼容OCI的規(guī)范,無論容器鏡像來自公共鏡像倉庫、Dockerfile構(gòu)建、自源代碼到鏡像Source to image(S2I)構(gòu)建,都能夠正確地存儲、管理和分發(fā),保證從容器運行時環(huán)境上傳與下載的容器鏡像一致。在容器鏡像倉庫中,鏡像文件也是按照分層結(jié)構(gòu)單獨存儲,并通過依賴關(guān)系組合成一體。 2 最簡的私有鏡像倉庫的搭建、使用和維護 2.1 公共鏡像倉庫 公有鏡像倉庫,全互聯(lián)網(wǎng)都可以訪問, 常見的如下表: 公共鏡像倉庫,你可以搜索到有用的鏡像并拉取下來,也可以上傳自己的鏡像管理并分享給其他人。 2.2 私有鏡像倉庫 公共鏡像倉庫是托管并在互聯(lián)網(wǎng)開放的服務,適合用于分享交流,但并不適合企業(yè)使用,上傳和下載都受限于網(wǎng)速,并且經(jīng)常會出現(xiàn)各種不確定的狀況導致失敗,鏡像的管理也受限于托管服務。因此,企業(yè)需要自己的私有鏡像倉庫,做到自主可控。 2.2.1 使用Docker Registry搭建簡易私有鏡像倉庫 首先需要一臺安裝好Linux (以下都以CentOS 8.2 minimal安裝為例)主機,建議配置4C8G或以上,且有獨立的500G以上的數(shù)據(jù)盤存儲鏡像文件。 假設IP為10.231.238.238, HOSTNAME為registry.,數(shù)據(jù)盤掛載在/data 運行如下命令安裝: yum install -y bash-completion curl wget httpd-tools bind-utils podmandocker-distribution 其中, docker-distribution是Docker Registry鏡像倉庫,podman是容器運行時,其它是工具。 生成密鑰和自簽證書:
注意,由于是自簽證書,所有要使用鏡像倉庫的機器都需要配置證書的信任,或者在podman命令中通過--tls-verify=false忽略證書校驗。 生成登錄用戶的用戶名和密碼的文件: htpasswd -cBb htpasswd twttest123 用戶名為twt,密碼為test123,密碼使用bcrypt算法 編輯/etc/docker-distribution/registry/config.yaml文件,添加或修改如下內(nèi)容:
配置防火墻開放https端口: firewall-cmd --permanent --add-service=https firewall-cmd --reload 啟動Docker Registry,并配置自動啟動:
通過如下命令檢查registry是否運行正常 curl -s -k -u twt:test123https://registry./v2/_catalog 如果返回{'repositories':[]}則表示我們搭建成功 2.2.2 使用podman運行私有鏡像倉庫 使用podman的好處是無須用root用戶或啟動系統(tǒng)守護進程,任意用戶都可以方便地使用容器運行時。 用root用戶配置防火墻開放5000端口:
下載Docker Registry鏡像: podman pull docker.io/library/registry:2 運行Docker Registry容器:
生成密鑰、證書、用戶密碼文件等,請參考2.2.1中的步驟。 2.3 私有鏡像倉庫的使用 2.3.1 推送鏡像
podmanpull nginx:1.16.1
podman images podman tag docker.io/library/nginx:1.16.1 registry.:5000/library/nginx:1.16.1
podman login -u twt -p test123 registry.:5000 podmanpush registry.:5000/library/nginx:1.16.1
curl -s -k -u twt:test123 https://registry.:5000/v2/_catalog curl -s -k -u twt:test123https://registry.:5000/v2/library/nginx/tags/list 如果分別返回 {'repositories':['library/nginx']} 和 {'name':'library/nginx','tags':['1.16.1']} 則表示推送成功 使用du命令,檢查私有鏡像倉庫目前使用磁盤大小 du -sh /data/registry/ 52M/data/registry/ 由于Docker Registry使用文件目錄保存鏡像文件,在本機的bash下也可以通過find命令查看鏡像倉庫中的鏡像: find /data/registry -print | \ grep 'v2/repositories' | \ grep 'current' | \ grep -v 'link' | \ sed -e 's/\/_manifests\/tags\//:/' | \ sed -e 's/\/current//' | \ sed -e 's/^.*repositories\///' | \ sort library/nginx:1.16.1 2.3.2 下載鏡像 下載鏡像前,先刪除本地的鏡像 podman rmi docker.io/library/nginx:1.16.1 podman rmi registry.:5000/library/nginx:1.16.1 podman images 下載鏡像并查看本地鏡像 podman login -u twt -p test123 registry.:5000 podman pullregistry.:5000/library/nginx:1.16.1 podman images 2.4 私有鏡像倉庫的維護 2.4.1 刪除具體鏡像 以上面私有倉庫的鏡像registry.:5000/library/nginx:1.16.1為例,如何將其從私有鏡像倉庫中刪除?只需要如下兩步
curl -k -u twt:test123 --head --silent -H 'Accept: application/vnd.docker.distribution.manifest.v2 json' -X GET https://registry.:5000/v2/library/nginx/manifests/1.16.1 | grep docker-content-digest | awk '{print ($2)}' sha256:02bab24df17e31f2795d0ac42c404d4de1312a4a745c8c46b10665cc6ad6faa2
curl -v -k -u twt:test123 -X DELETE https://registry.:5000/v2/library/nginx/manifests/sha256:02bab24df17e31f2795d0ac42c404d4de1312a4a745c8c46b10665cc6ad6faa2
curl -s -k -u twt:test123https://registry.:5000/v2/library/nginx/tags/list {'name':'library/nginx','tags':null}
可以看到,有6個blob被清理掉
du -sh /data/registry/ 128K /data/registry/ 2.4.2 自動清理私有鏡像倉庫的過期鏡像 隨著應用越來越多,鏡像倉庫中包含的鏡像和版本也越來越多,特別是測試環(huán)境,構(gòu)建次數(shù)非常多鏡像版本也非常多,如何做到自動清理過期的鏡像呢? 比如
可以參考 https://github.com/burnettk/delete-docker-registry-image 或者https://github.com/andrey-pohilko/registry-cli/blob/master/registry.py
|
|