1. 程式人生 > >Docker | 第六章:構建私有倉庫

Docker | 第六章:構建私有倉庫

推送 sun 指定 公司 網絡環境 add 屬性 提示 回收機制

前言

上一章節,講解了利用Dockerfilecommit進行自定義鏡像的構建。大部分時候,公司運維或者實施部門在構建了符合公司業務的鏡像環境後,一般上不會上傳到公共資源庫的。這就需要自己搭建一個私有倉庫,來存放自己的鏡像數據,同時也可以存儲其他鏡像,方便拉取,比較國內的網絡環境連接還是比較慢的。所以,本章節介紹下如何構建私有倉庫。

  • 安裝Registry
  • 管理Registry
    • Registry接口列表
    • 刪除鏡像示例
  • 參考資料
  • 總結
  • 最後
  • 老生常談

安裝Registry

Docker官方提供了Registry鏡像,方便構建自己的私有倉庫。所以,接下來講解下私有倉庫服務的安裝。

  • 拉取Registry鏡像
  docker pull registry
  • 啟動Registry鏡像

由於Registry是一個鏡像,運行後若我們刪除了容器,裏面的資源就都丟失了,所以我們在運行時,指定一個資源的掛載目錄,映射到宿主的一個目錄下,這樣資源就不會丟失了。

docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always  --name registry registry:latest

提示:restart=always 是指docker重啟時此容器自動啟動。
啟動後,就能通過:http://宿主IP:1888/v2 ,訪問了。

技術分享圖片

  • 本地推送鏡像至倉庫

我們在本地創建一個鏡像,同時推送到倉庫上。

 # 利用tag 標記一個新鏡像
 docker tag hello-world 127.0.0.1:1888/demo/hello-world:latest
 # 推送鏡像
 docker push 127.0.0.1:1888/demo/hello-world:latest

此時,訪問私有倉庫地址:http://宿主IP:1888/v2/_catalog, 即可看見推送的鏡像信息了。

技術分享圖片

  • 遠程推送鏡像至倉庫

直接使用127.0.0.1或者local時,是沒有進行安全檢驗的。當我們使用外部的ip地址推送時,Registry為了安全性考慮,默認是需要https

證書支持的。

錯誤提示:

[root@izbp16chpwsnff41nrjtfhz ~]# docker push 47.98.238.247:1888/demo/hello-world:v1
The push refers to repository [47.98.238.247:1888/demo/hello-world]
Get https://47.98.238.247:1888/v2/: http: server gave HTTP response to HTTPS client

搜索相關資料後,有兩種方案:一種是通過daemon.json配置一個insecure-registries屬性;另一種就直接配置一個https的證書了。https的相關配置不在本章節講解範圍了,這裏就不示例了,最穩妥的做法可以是:利用nginx行https證書支持,然後代理到Registry服務。有興趣的可以自己動手實現下。

針對第一種做法,這裏示例下:

{
"insecure-registries": ["實際的ip:端口"]
}

之後重啟Docker

systemctl restart docker

之後再進行推送就能推送成功了

docker push 47.98.238.247:1888/demo/hello-world:v1

查看下鏡像的版本列表就能知道是否上傳成功。

技術分享圖片

管理Registry

倉庫很大,要是沒有一套管理規則,也是很頭疼的事情。所以接下來,講解下如何管理Registry。

Registry接口列表

以下轉至:https://cloud.tencent.com/developer/article/1116799 。詳細可點擊查看。

方法 路徑 分類 描述
GET /v2/ Base 檢查是否支持2.0接口
GET /v2/${image}/tags/list Tags 獲取鏡像標簽列表
GET /v2/${image}/manifests/ Manifest 獲取鏡像主要信息
PUT /v2/${image}/manifests/ Manifest 修改鏡像主要信息
DELETE /v2/${image}/manifests/ Manifest 刪除鏡像的主要信息
GET /v2/${image}/blobs/ Blob 獲得鏡像層
DELETE /v2/${image}/blobs/ Blob 刪除鏡像層
POST /v2/${image}/blobs/uploads/ Initiate Blob Upload 開始分塊上傳
GET /v2/${image}/blobs/uploads/ Blob Upload 獲得分塊上傳的速度
PATCH /v2/${image}/blobs/uploads/ Blob Upload 分塊上傳數據
PUT /v2/${image}/blobs/uploads/ Blob Upload 完成上傳
DELETE /v2/${image}/blobs/uploads/ Blob Upload 取消上傳
GET /v2/_catalog Catalog 獲得鏡像列表

基本上的管理都是通過以上的api接口方式了,大家可自行嘗試下。

刪除鏡像示例

這裏就簡單示例下比較常用的也比較麻煩的刪除鏡像方法。這裏直接使用curl也可使用POSTMAN等api嘗試工具進行.

註意:由於默認是不允許刪除鏡像的(提示方法不支持),所以需要進行配置,開啟刪除功能。所以我們在啟動時,直接設置參數(REGISTRY_STORAGE_DELETE_ENABLED=true):

docker run -d -v /opt/docker/registry:/var/lib/registry -p 1888:5000 --restart=always  --name registry -e "REGISTRY_STORAGE_DELETE_ENABLED=true" registry:latest

或者可設置/etc/docker/registry/config.yml,加入storage.delete.enabled設置為true(yaml格式)

version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    enable: true
http:        
  addr: :5000                        
  headers:                           
    X-Content-Type-Options: [nosniff]
health:          
  storagedriver: 
    enabled: true
    interval: 10s
    threshold: 3

技術分享圖片

之後重啟(restart)容器即可。

提示:對於config.yml配置文件,裏面可以設置很多的屬性信息,具體屬性可查看官網說明:https://docs.docker.com/registry/configuration/

刪除鏡像

curl -I -X --header "Accept: application/vnd.docker.distribution.manifest.v2+json" DELETE http://127.0.0.1:1888/v2/demo/hello-world/manifests/sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1
  • name:鏡像名稱。
  • reference:刪除時必須是鏡像對應sha256值,推送時,可以獲悉sha256值。
    技術分享圖片

技術分享圖片

或者利用get獲取對應鏡像信息:

curl -X GET   http://47.98.238.247:1888/v2/demo/hello-world/manifests/v1   -H ‘Cache-Control: no-cache‘

再或者可以直接根據存儲目錄查看(由於掛載宿主目錄,所以我們直接在宿主機查看):

/opt/docker/registry/docker/registry/v2/repositories/demo/hello-world/_manifests/tags/v2/index/sha256/link

技術分享圖片

利用cat命令 或者 直接打開文件查看:

技術分享圖片


題外話:關於Postman用法,可點擊查看

技術分享圖片


刪除前:

技術分享圖片

資源庫大小:

技術分享圖片

執行刪除後,發現tag已經為null了:

技術分享圖片

再看看大小,是沒有變化的:

技術分享圖片

因為只刪除了tag,鏡像文件沒有刪除。所以我們進入容器執行下回收命令:

/ # registry garbage-collect /etc/docker/registry/config.yml
demo/hello-world
test/hello-world
test/hello-world: marking manifest sha256:aca41a608e5eb015f1ec6755f490f3be26b48010b178e78c00eac21ffbe246f1 
test/hello-world: marking blob sha256:2cb0d9787c4dd17ef9eb03e512923bc4db10add190d3f84af63b744e353a9b34
test/hello-world: marking blob sha256:9db2ca6ccae029dd195e331f4bede3d2ea2e67e0de29d6a0f8c1572e70f32fa7

3 blobs marked, 1 blobs eligible for deletion
blob eligible for deletion: sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/a3/a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4  go.version=go1.7.6 instance.id=de550dcd-7e54-4279-a9e4-d3609c83b11b

這個時候就已經回收了。目前貌似沒有自動回收機制。

技術分享圖片

可以看見大小發生了變化了,說明鏡像已經被清理了。也可以去剛剛查看sha256目錄查看,裏面的信息已經被刪除了

技術分享圖片

最後想說,利用命令去刪除之類的太麻煩了,現在有很多開源的工具可以管理倉庫。大家可以自行搜索下。這裏可以看看這個開源的刪除資源的工具類:https://github.com/burnettk/delete-docker-registry-image,具體使用方法有具體說明。

參考資料

官方的文檔還是很齊全的,建議大家還是直接去官網查看相關資料。

  1. 官網:https://docs.docker.com/registry
  2. https://blog.csdn.net/sunshingheavy/article/details/54143764
  3. https://cloud.tencent.com/developer/article/1116799
  4. https://blog.csdn.net/nklinsirui/article/details/80705306
  5. https://github.com/burnettk/delete-docker-registry-image

總結

本章節主要是介紹如何利用Registry進行私有倉庫的創建及管理。對於單純的api調用而言,有點麻煩,可以上網找寫批量的腳本,簡化步驟下。由於對linux命令不是很熟悉,大家還是自行谷歌吧。正常而言,還是應該有個管理的UI界面會更方便點。在後面講解Docker可視化界面管理時再來詳細說明下,因為本人也沒有搭建過,後面會為了這個章節找些資料,然後分享給大家。敬請期待!

最後

若文中有錯誤或者遺漏之處,還望指出,共同進步!

老生常談

  • 個人QQ:499452441
  • 微信公眾號:lqdevOps

技術分享圖片

個人博客:http://blog.lqdev.cn

原文地址:http://blog.lqdev.cn/2018/08/05/docker/docker-six/

Docker | 第六章:構建私有倉庫