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

前言

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

安裝Registry

Docker官方提供了Registry鏡像,方便構建本身的私有倉庫。因此,接下來說解下私有倉庫服務的安裝。nginx

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

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

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 ,訪問了。github

registry http訪問

  • 本地推送鏡像至倉庫

咱們在本地建立一個鏡像,同時推送到倉庫上。spring

# 利用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, 便可看見推送的鏡像信息了。docker

全部鏡像

  • 遠程推送鏡像至倉庫

直接使用127.0.0.1或者local時,是沒有進行安全檢驗的。當咱們使用外部的ip地址推送時,Registry爲了安全性考慮,默認是須要https證書支持的。json

錯誤提示:api

[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服務。有興趣的能夠本身動手實現下。安全

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

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

以後重啓Docker

systemctl restart docker

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

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

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

鏡像tag列表

管理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/<referevce> Manifest 獲取鏡像主要信息
PUT /v2/${image}/manifests/<referevce> Manifest 修改鏡像主要信息
DELETE /v2/${image}/manifests/<reference> Manifest 刪除鏡像的主要信息
GET /v2/${image}/blobs/<digest> Blob 得到鏡像層
DELETE /v2/${image}/blobs/<digest> Blob 刪除鏡像層
POST /v2/${image}/blobs/uploads/ Initiate Blob Upload 開始分塊上傳
GET /v2/${image}/blobs/uploads/<uuid> Blob Upload 得到分塊上傳的速度
PATCH /v2/${image}/blobs/uploads/<uuid> Blob Upload 分塊上傳數據
PUT /v2/${image}/blobs/uploads/<uuid> Blob Upload 完成上傳
DELETE /v2/${image}/blobs/uploads/<uuid> 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值。 刪除時reference必須爲digest

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命令 或者 直接打開文件查看:

sha256查看


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

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. http://www.javashuo.com/article/p-uwozigis-mn.html
  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/

相關文章
相關標籤/搜索