上一章節,講解了利用
Dockerfile
和commit
進行自定義鏡像的構建。大部分時候,公司運維或者實施部門在構建了符合公司業務的鏡像環境後,通常上不會上傳到公共資源庫的。這就須要本身搭建一個私有倉庫,來存放本身的鏡像數據,同時也能夠存儲其餘鏡像,方便拉取,比較國內的網絡環境鏈接仍是比較慢的。因此,本章節介紹下如何構建私有倉庫。linux
Docker
官方提供了Registry
鏡像,方便構建本身的私有倉庫。因此,接下來說解下私有倉庫服務的安裝。nginx
docker pull 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
咱們在本地建立一個鏡像,同時推送到倉庫上。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地址推送時,Registr
y爲了安全性考慮,默認是須要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
查看下鏡像的版本列表就能知道是否上傳成功。
倉庫很大,要是沒有一套管理規則,也是很頭疼的事情。因此接下來,講解下如何管理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
或者利用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,具體使用方法有具體說明。
官方的文檔仍是很齊全的,建議你們仍是直接去官網查看相關資料。
本章節主要是介紹如何利用
Registry
進行私有倉庫的建立及管理。對於單純的api
調用而言,有點麻煩,能夠上網找寫批量的腳本,簡化步驟下。因爲對linux命令不是很熟悉,你們仍是自行谷歌吧。正常而言,仍是應該有個管理的UI界面會更方便點。在後面講解Docker可視化界面管理
時再來詳細說明下,由於本人也沒有搭建過,後面會爲了這個章節找些資料,而後分享給你們。敬請期待!
若文中有錯誤或者遺漏之處,還望指出,共同進步!
499452441
lqdevOps
我的博客:http://blog.lqdev.cn