我的docker随笔38:用 registry 搭建私有仓库
本文涉及一種在服務器部使用 registry 署私有鏡像倉庫的方法。經驗證,可達到預期目標,并能應用在實際工作中。
一、引言
由于測試服務器無法使用外部網絡,而又需要容器化部署應用程序。經考慮,使用 registry 搭建 docker 鏡像倉庫服務。當然,能提供類似的軟件很多,功能也比較強大,但時間緊任務重,使用最簡單的方式即可。
二、技術小結
- 拉取 registry 鏡像。
- 運行 registry 容器,注意掛載目錄。
- 編輯daemon.json文件,添加倉庫地址。
三、實踐
3.1 下載、運行
拉取registry鏡像:
docker pull registry:2注:
實際操作中,因為服務器無法連接外部網絡,因為是先在虛擬機下載好鏡像,再通過docker save導出鏡像,再用scp上傳到服務器,再用docker load導入到服務器,完成“下載”動作。
新建工程目錄,用于存儲配置文件及數據文件。
新建config.yml配置文件:
version: 0.1 log:fields:service: registry storage:delete:enabled: truecache:blobdescriptor: inmemoryfilesystem:rootdirectory: /var/lib/registry http:addr: :5000headers:X-Content-Type-Options: [nosniff] health:storagedriver:enabled: trueinterval: 10sthreshold: 3注:上述config.yml文件實際是筆者啟動容器后,直接取 /etc/docker/registry/config.yml 文件內容的,因為要加配置,所以單獨拿出掛載。
上述文件加了刪除使能配置。
docker-compose.yaml配置文件:
version: '2'services:ttregistry:image: registry:2container_name: ttregistryrestart: alwaysvolumes:- ./registry_data:/var/lib/registry- ./config.yml:/etc/docker/registry/config.yml environment:- TZ=Asia/Shanghaiports:- "5000:5000"networks:- registry-netnetworks:registry-net:driver: bridge啟動:
docker-compose up -d3.2 配置倉庫地址
因為本文registry沒有配置https模式,而docker命令默認是該模式,因此需要設置非安全倉庫地址。在daemon.json 中添加,示例:
$ cat /etc/docker/daemon.json {"registry-mirrors": ["https://a8qh6yqv.mirror.aliyuncs.com","http://hub-mirror.c.163.com"],"insecure-registries": ["http://172.18.18.168:5000"] }不管推送鏡像還是拉取鏡像,都可能遇到此問題。因此,都要在相應的機器上進行設置。
設置好后,需要重啟docker服務:
sudo systemctl restart docker如不配置,則在推送或拉取鏡像出錯,示例:
Using default tag: latest Error response from daemon: Get https://172.18.18.168:5000/v2/: http: server gave HTTP response to HTTPS client3.3 測試
拉取官方鏡像
docker pull busybox需要將鏡像打上標簽,否則默認上傳到 docker 官方倉庫。
#標記鏡像 $ docker tag busybox 172.18.18.168:5000/busybox推送鏡像到私有倉庫
$ docker push 172.18.18.168:5000/busybox Using default tag: latest The push refers to repository [172.18.18.168:5000/busybox] 01fd6df81c8e: Pushed latest: digest: sha256:62ffc2ed7554e4c6d360bce40bbcf196573dd27c4ce080641a2c59867e732dee size: 527在另一機器上嘗試拉取:
docker pull 172.18.18.168:5000/busybox四、操作
4.1 接口
訪問:http://172.18.18.168:5000/v2/,顯示{},說明服務運行正常。
查詢有哪些鏡像:http://172.18.18.168:5000/v2/_catalog
查詢某個鏡像的版本:http://172.18.18.168:5000/v2/busybox/tags/list
4.2 命令
4.2.1 獲取鏡像信息
curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/<鏡像名稱>/manifests/<鏡像版本>示例:
$curl -H "Accept:application/vnd.docker.distribution.manifest.v2+json" http://172.18.18.168:5000/v2/busybox/manifests/latest{"schemaVersion": 2,"mediaType": "application/vnd.docker.distribution.manifest.v2+json","config": {"mediaType": "application/vnd.docker.container.image.v1+json","size": 1456,"digest": "sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a"},"layers": [{"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip","size": 772788,"digest": "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa"}] }注:
如果curl沒有加-H字段,得到的結果較亂,不太方便分析,因此加上。
在瀏覽器直接訪問亦可,但筆者測試發現,要下載文件再分析,故不采用。
4.2.2 刪除鏡像(測試不成功)
刪除鏡像需指定digest值,從獲取鏡像信息的config字段中找到即可。命令:
curl -X DELETE http://172.18.18.168:5000/v2/<鏡像>/manifests/sha256:<config字段的digest值>示例:
curl -X DELETE http://172.18.18.168:5000/v2/busybox/manifests/sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a垃圾回收:
docker exec -it ttregistry bin/registry garbage-collect /etc/docker/registry/config.yml4.2.3 刪除鏡像另一法(有效)
些法是直接在物理層面刪除,通過重啟服務方式徹底刪除。可不用上面配置delete功能。
刪除存儲卷上的鏡像:
rm -rf registry_data/docker/registry/v2/repositories/busybox/執行垃圾回收。
重啟registry容器。
五、小結
本著適目的(其實是時間不足),本文僅使用 registry 即能達到目標,因此不再繼續研究 Harbor 等高端的服務,日后如有必要,再進行亦未晚。實際上,筆者對 Harbor 也有接觸,那時有雄心有干勁(掙錢),但那是很多年前的事了。
李遲 2022.10.20 周四 夜
總結
以上是生活随笔為你收集整理的我的docker随笔38:用 registry 搭建私有仓库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自动控制理论(3)——控制系统的数学模型
- 下一篇: 【热门主题】紫色梦幻天使win7主题