我們知道,在harbor GUI界面上刪除docker image鏡像後,發現磁盤空間並沒有減少(linux上用 df -h就能發現)。那如何才能刪除這些東西呀?步驟如下:
1. 登錄harbor GUI 管理頁面,刪除那些docker 鏡像。
軟刪除後,Harbour中不再管理存儲庫,但是存儲庫的文件仍然保留在Harbour的存儲中。
2. 修改 common/config/registry/config.yml文件
此文件在harbor安裝目錄下,關閉的目的是爲了禁止身份驗證
3. 修改 docker-compose.yml 文件
此文件在harbor安裝目錄下,修改此文件的目的是把registry port端口暴露出來,添加紅框出的配置,注意格式。
4. 重新配置harbor,使其配置生效
cd harbor的home目錄;執行
docker-compose down
docker-compose up -d
5. 清理已刪除未使用的清單
docker run --network="host" -it -v /data/registry:/registry -e REGISTRY_URL=http://127.0.0.1:5000 mortensrasmussen/docker-registry-manifest-cleanup:1.1.2beta
這裏直接執行即可.
6、清理以刪除現在不再與清單關聯的blob
docker run -it --name gc --rm --volumes-from registry vmware/registry-photon:v2.6.2-v1.4.0 garbage-collect /etc/registry/config.yml
注意,這裏 vmware/registry-photon:v2.6.2-v1.4.0 得換成你自己的harbor版本,如何知道你自己的版本?用下面的命令即可。
docker images | grep registry-photon
7、把步驟2和步驟3的配置修改回初始狀態,並重啓harbor。
docker-compose down
docker-compose up -d
爲啥要用上面的步驟? 原因如下:
Harbor刪除鏡像後且GC清理後,磁盤空間沒有釋放。因爲我們push大量相同標籤的鏡像,Docker 鏡像由標籤引用,並由唯一的摘要標識。這意味着如果myImage
使用標記推送兩個圖像,在DR內部他們顯示的不同,它們將由兩個不同的digests標識。最後推送的Images是當前的。Docker 鏡像由layers組成,每個layers都關聯一個blob。該blob是最佔用存儲的文件; 這些文件將由GC清理。正由上面的描述每個鏡像都會存儲一個引用,因爲,我們重複提交10次,那一個標籤在DR中會有10個引用,標籤只能獲取tag。而其他9個只能用digest獲取了。
簡單的來說就是因爲相同的標籤的鏡像重複提交次數過多導致。
參考資料: