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