摘要:若要開啟刪除鏡像功能,需要修改鏡像倉庫的配置文件。一個可行的解決辦法是手動更改鏡像倉庫的配置,暫時禁止鏡像的操作。
用友云開發(fā)者中心是基于Docker容器進行微服務(wù)架構(gòu)應(yīng)用的落地與管理。相信各位同學在使用的過程中,會發(fā)現(xiàn)隨著Docker鏡像的增多,占用磁盤空間也約來越多。這時我們需要清理私有鏡像倉庫中不需要的鏡像。但在實際操作時,才會發(fā)現(xiàn)這本以為很簡單的任務(wù)中卻暗藏玄機,遇到了不少的麻煩。在這里我們分享一下清理鏡像倉庫時遇到的坑點。想要直接尋求解決方案的同學可以直接看第二部分。
一、那些年,我們在清理鏡像倉庫時走過的坑
坑點1:官方提供的接口并不能真正的刪除鏡像
這著實是最大的坑點。很多同學查資料發(fā)現(xiàn),官方已經(jīng)提供了刪除鏡像倉庫的API,所以可能相當然的以為直接使用就好,殊不知掉入了官方埋下的最大的坑點,也是本文要著手解決的核心問題:官方提供的刪除鏡像倉庫中鏡像的接口,僅僅是把manifest刪除了,真正的鏡像文件還存在!官方并沒有提供刪除鏡像層的接口!這也就是說,當我們調(diào)用刪除鏡像的接口之后,僅僅是查看鏡像的列表時看不到原鏡像了,然而原有鏡像仍然在磁盤中,占用著寶貴的文件存儲空間。
坑點2:直接調(diào)用官方的刪除鏡像API,會返回405的錯誤碼
直接調(diào)用刪除鏡像的接口,可能會遇到以下錯誤提示:
405,意味著方法不被允許。實際上,官方可能是處于安全性的考慮,在默認的情況下禁止了直接刪除鏡像的功能。若要開啟刪除鏡像功能,需要修改鏡像倉庫的配置文件。具體操作為修改/etc/docker/registry/config.yml文件,在storage下添加delete的許可之后,重啟鏡像倉庫服務(wù)。
坑點3:使用官方提供的garbage-collect工具,會有無用的文件殘留
官方為registry提供了garbage-collect(gc)工具清理鏡像的物理存儲,將沒有引用的layer刪除。
gc的清理過程分為兩部分:
1)mark:掃描所有的manifest,列出引用的layer;
2)sweep:掃描所有的layer,不在mark里的layer將被清理刪除。
gc可以在dry-run的模式下運行(添加參數(shù)-d),只輸出gc信息,不進行實際操作。我們可以通過這種方式來確認哪些鏡像會被清除。
使用gc工具清理鏡像的一個問題就是文件清理得不夠干凈,無法清理已經(jīng)沒有tag的鏡像目錄,并且還殘存少部分文件,從十KB到幾十KB不等。久而久之,垃圾文件和目錄的數(shù)量會越來越多。
坑點4:garbage-collect不是事務(wù)操作,清理鏡像時可能會產(chǎn)生誤操作
gc不是事務(wù)操作,當gc過程中剛好有push操作時,則可能會誤刪數(shù)據(jù)。一個可行的解決辦法是手動更改鏡像倉庫的配置,暫時禁止鏡像的push操作。
在鏡像倉庫的配置文件中可以配置read-only模式。當啟用read-only之后,再push鏡像時會得到405的錯誤。gc完成后取消read-only模式,再push鏡像即可。
坑點5:使用garbage-collect工具后,必須重啟鏡像倉庫才能正常使用
如果不重啟鏡像倉庫,則再次push該鏡像時可能會得到layer already exists錯誤:
其可能的原因是鏡像被刪除后,倉庫的緩存中還存有已經(jīng)刪除的鏡像信息,所以再次push會報層存在的錯誤。
二、兩種清理鏡像倉庫的方案
方案一:使用官方API + GC
使用官方提供的方法可以較為簡便的清理鏡像倉庫。整個清理過程可能需要幾百毫秒到幾秒的時間。此操作有一定的危險性,因此清理鏡像不宜過于頻繁。官方在git上也有類似描述。點擊查看:https://github.com/docker/doc...
具體操作過程如下:
1、準備工作
在配置中許可刪除操作。修改鏡像倉庫的配置文件,一般在如下路徑:
/etc/docker/registry/config.yml
在storage下添加delete的許可之后,重啟鏡像倉庫。
用docker方式啟動的鏡像倉庫也可以添加環(huán)境變量:
REGISTRY_STORAGE_DELETE_ENABLED=true
2、獲取待刪鏡像的digest
獲取鏡像digest的API為:
GET /v2/
其中,name是倉庫名,reference是標簽,此時需要注意,調(diào)用時需要加上header內(nèi)容:
Accept: application/vnd.docker.distribution.manifest.v2+json
其中Docker-Content-Digest的值就是鏡像的digest
3、調(diào)用官方的HTTP API V2刪除鏡像
刪除鏡像的API為:
DELETE /v2/
其中,name是倉庫名稱,reference是包含“sha256:”的digest。
4、調(diào)用GC清理鏡像文件
使用gc工具的方式為:
bin/registry garbage-collect /etc/docker/registry/config.yml
gc清理需要時間,如果在gc過程中剛好有push操作,可能會產(chǎn)生未知的問題,建議設(shè)置read-only模式之后再進行g(shù)c,然后再改回來。
5、重啟docker registry
注意,如果不重啟會導致push相同鏡像時產(chǎn)生layer already exists錯誤。
方案二:使用第三方腳本
在清理鏡像倉庫這件事上,業(yè)內(nèi)已經(jīng)有很多人進行過各種各樣的嘗試。本文挑選一種比較好的方式推薦使用。
1、宿主機安裝delete-docker-registry-image
可參考此命令的安裝和使用方式。參考鏈接:https://github.com/burnettk/d...
2、執(zhí)行delete-docker-registry-image命令可以刪除某個倉庫(sb)
或者某個具體的鏡像(如alpine:3.2)
如果刪除某鏡像后該倉庫為空,可以用刪除倉庫的方式刪除此空倉。
該工具也提供了dry-run的方式,只輸出待刪除的信息不執(zhí)行刪除操作。在命令后加上——dry-run即可。
3、重啟docker registry
跟gc方式一樣,刪除鏡像之后要重啟docker registry,不然還是會出現(xiàn)相同鏡像push不成功的問題。
以上就是本文推薦的兩種清理鏡像倉庫的兩種方案。第一種方案更多的使用了官方提供的工具,使用時相對更加安全,且無需額外安裝其他內(nèi)容。第二種方案使用了第三方工具或腳本,使用時更加靈活且簡便,且清理的更加徹底。具體操作時可根據(jù)自己的需求選擇方案。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/27685.html
摘要:二緣起對于一個普通的屌絲創(chuàng)業(yè)公司的屌絲項目來說,理論上來說是沒必要用太復(fù)雜的技術(shù)的,對新技術(shù)的克制也是碼農(nóng)的一個職業(yè)操守。 Docker出現(xiàn)后,容器技術(shù)在互聯(lián)網(wǎng)領(lǐng)域得到了空前的普及,無論是大公司還是屌絲創(chuàng)業(yè)公司的碼農(nóng)基本上都會在各種技術(shù)社區(qū)或者各種演講會議上了解到過相關(guān)技術(shù),我們作為一家屌絲創(chuàng)業(yè)公司也不例外,去年對Docker做了一番了解,并在年前測試了一些方案,今天在這里總結(jié)一下遇到...
摘要:二緣起對于一個普通的屌絲創(chuàng)業(yè)公司的屌絲項目來說,理論上來說是沒必要用太復(fù)雜的技術(shù)的,對新技術(shù)的克制也是碼農(nóng)的一個職業(yè)操守。 Docker出現(xiàn)后,容器技術(shù)在互聯(lián)網(wǎng)領(lǐng)域得到了空前的普及,無論是大公司還是屌絲創(chuàng)業(yè)公司的碼農(nóng)基本上都會在各種技術(shù)社區(qū)或者各種演講會議上了解到過相關(guān)技術(shù),我們作為一家屌絲創(chuàng)業(yè)公司也不例外,去年對Docker做了一番了解,并在年前測試了一些方案,今天在這里總結(jié)一下遇到...
摘要:二緣起對于一個普通的屌絲創(chuàng)業(yè)公司的屌絲項目來說,理論上來說是沒必要用太復(fù)雜的技術(shù)的,對新技術(shù)的克制也是碼農(nóng)的一個職業(yè)操守。 Docker出現(xiàn)后,容器技術(shù)在互聯(lián)網(wǎng)領(lǐng)域得到了空前的普及,無論是大公司還是屌絲創(chuàng)業(yè)公司的碼農(nóng)基本上都會在各種技術(shù)社區(qū)或者各種演講會議上了解到過相關(guān)技術(shù),我們作為一家屌絲創(chuàng)業(yè)公司也不例外,去年對Docker做了一番了解,并在年前測試了一些方案,今天在這里總結(jié)一下遇到...
摘要:一個鏡像可以放到另一個京廣線的頂部,位于下面的鏡像稱為父鏡像,最底部的稱為基礎(chǔ)鏡像。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式的結(jié)構(gòu),由一系列指令一步步構(gòu)建處理。拉取鏡像使用命令啟動一個鏡像時,會檢查本地是否存在該鏡像。 什么是鏡像 Docker鏡像時由文件系統(tǒng)疊加而成,最底端是一個引導文件系統(tǒng),即bootfs,這很像典型的Linux/Unix的引導文件系統(tǒng)。Docker用戶幾乎永遠不會和引導...
摘要:本人的學習筆記,主要是對我的第一本書從入門到實踐的學習記錄,并結(jié)合其他各種資源的學習,歡迎大牛們指點。最新的容器引入了容器如,容器不再僅僅是一個單純的運行環(huán)境。鏡像是基于聯(lián)合文件系統(tǒng)的一種層式的結(jié)構(gòu),由一系列指令一步步構(gòu)建處理。 本人的學習筆記,主要是對《我的第一本Docker書》、《Docker —— 從入門到實踐》的學習記錄,并結(jié)合其他各種資源的學習,歡迎大牛們指點。 容器簡介 ...
閱讀 1384·2021-10-08 10:04
閱讀 2700·2021-09-22 15:23
閱讀 2730·2021-09-04 16:40
閱讀 1181·2019-08-29 17:29
閱讀 1500·2019-08-29 17:28
閱讀 2997·2019-08-29 14:02
閱讀 2228·2019-08-29 13:18
閱讀 850·2019-08-23 18:35