私有倉庫: 在本地(區域網)搭建的一個類似公共倉庫的東西,我們可以將映象提交到私有倉庫中,供區域網內的其它人拉取使用。 本文以 Registry 為例,並在提供私有倉庫的主機上操作
拉取私有倉庫映象請先確保你當前擁有的映象有 registry
如果沒有,可以先拉取下來
docker image pull registry
設定私有倉庫地址
vim /etc/docker/daemon.json
修改 insecure-registries 的值,提供私有倉庫的主機的ip地址和埠
{ ... "insecure-registries":[ "192.168.1.234:5000" ], ...}
Mac軟體版
修改後重新啟動 docker 服務
執行私有倉庫映象資源將 registry 映象生成一個容器並執行起來
# -p 5000:5000 # 第一個是容器使用的埠,第二個是本地埠,這裡是本地埠對映到把容器的埠docker run -d -p 5000:5000 registry
~/lxf ❯ docker ps❯ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf12ad7ae43ca registry "/entrypoint.sh /etc…" 9 minutes ago Up 9 minutes 5000/tcp nostalgic_elion
此時你可以訪問如下地址,如果看到 {} 就說明 Registry 執行正常
http://192.168.1.234:5000/v2/
上傳映象比如此時我要將 ubuntu 這個映象上傳到私有倉庫
# 給ubuntu映象打一個tag,命名需為 私有倉庫主機ip:埠/映象名:[版本號,不加預設為latest]docker tag ubuntu:latest 192.168.1.234:5000/ubuntu:v0.1
開始上傳映象至本地的私有倉庫中
# docker push <registry_ip>:<registry_port>/<image_name>:<image_tag>docker push 192.168.1.234:5000/ubuntu:v0.1
拉取映象
先將本地的 v0.1 刪掉
docker rmi 192.168.1.234:5000/ubuntu:v0.1
拉取私有倉庫中 ubuntu 的 0.1 版本映象
# docker pull <registry_ip>:<registry_port>/<image_name>:<image_tag>docker pull 192.168.1.234:5000/ubuntu:v0.1
搜尋映象
Registry 不支援透過 docker search 這種方式去搜索映象,會報 404 的錯誤
需要使用 V2 API 去查詢
列出倉庫中所有的映象curl 192.168.1.234:5000/v2/_catalog
列出指定映象的所有標籤
# curl -X GET http://<registry_ip>:<registry_port>/v2/<image_name>/tags/listcurl 192.168.1.234:5000/v2/lxf/tags/list
先執行命令找到該映象的 digest
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://192.168.1.234:5000/v2/lxf/manifests/0.2 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
得到輸出值
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://192.168.1.234:5000/v2/lxf/manifests/sha256:4e4bc990609ed865e07afc8427c30ffdddca5153fd4e82c20d8f0783a291e241
需要在執行 Registry 容器時設定REGISTRY_STORAGE_DELETE_ENABLED 為 true
舉例
docker-compose.yaml:設定環境變數
environment: REGISTRY_STORAGE_DELETE_ENABLED: "true"
docker run:新增引數
# -e REGISTRY_STORAGE_DELETE_ENABLED="true"docker run -d -p 5000:5000 -e REGISTRY_STORAGE_DELETE_ENABLED="true" registry
垃圾回收
執行垃圾回收,上述刪除的映象才會真正從硬碟上移除
docker exec -it registry的容器名 /bin/registry garbage-collect /etc/docker/registry/config.yml