Docker | 第六章:構建私有倉庫
前言
上一章節,講解了利用
Dockerfile
和commit
進行自定義鏡像的構建。大部分時候,公司運維或者實施部門在構建了符合公司業務的鏡像環境後,一般上不會上傳到公共資源庫的。這就需要自己搭建一個私有倉庫,來存放自己的鏡像數據,同時也可以存儲其他鏡像,方便拉取,比較國內的網絡環境連接還是比較慢的。所以,本章節介紹下如何構建私有倉庫。
- 安裝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地址推送時,Registr
y為了安全性考慮,默認是需要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,具體使用方法有具體說明。
參考資料
官方的文檔還是很齊全的,建議大家還是直接去官網查看相關資料。
- 官網:https://docs.docker.com/registry
- https://blog.csdn.net/sunshingheavy/article/details/54143764
- https://cloud.tencent.com/developer/article/1116799
- https://blog.csdn.net/nklinsirui/article/details/80705306
- 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 | 第六章:構建私有倉庫