docker刪除倉庫中的鏡像

centos7.4 docker 1.13.1

mkdir /registry-var

mkdir /registry-var/my_registry

docker run --restart=always --name registry -d -p 5000:5000 -v /registry-var/my_registry:/var/lib/registry registry

push到該容器的鏡像會保存在宿主機的/registry-var/my_registry下 如果使用比如nfs 分佈式的存儲等大概 就能雙活了

registry版本默認就是v2的了 並且我試驗下來 鏡像保存目錄不是很多文章裏的tmp 而是/var/lib

Create or modify /etc/docker/daemon.json

{ "insecure-registries":["192.168.2.200:5000"] }

注意 192.168.2.200是我倉庫的ip 也可以是域名,請勿照抄。
如果使用域名配合內部dns 加速分佈式存儲 應該就能多倉庫實例多活了 (或者雙docker+虛ip方案災備高可用)
注意:1.12以後 這裏這個json文件會影響是否能登錄http而非https的倉庫,如果你的倉庫是http的,沒在這個json文件里加上端口域名或者ip,會報:
Error response from daemon: Get https://registry.x.com:5000/v2/: http: server gave HTTP response to HTTPS client 這個錯

加了以後就可以http協議登陸而不用把服務器端改成https
systemctl restart docker.service

完美解決。

上傳到私有倉庫示例:

首先存在 比如centos 鏡像

然後重新tag標記

docker tag centos 192.168.2.200:5000/centos

然後就可以推送到私庫了

docker push 192.168.2.200:5000/centos

下載示例:

docker pull 192.168.2.200:5000/centos

補充方案:

下面是老的docker 大概1.10以前的做法 在1.12沒用了

vi /usr/lib/systemd/system/docker.service

改這句 加後綴參數

ExecStart=/usr/bin/dockerd --insecure-registry=192.168.2.200:5000

[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker.service

查詢有哪些鏡像:(registry.x.com:5000是我假定的鏡像地址和端口,-u是用戶名密碼)

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/_catalog

返回:{"repositories":["centos"]}

centos是我測試上傳的一個centos最新版的鏡像

查看一個鏡像有哪些tag 也就是版本吧

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/centos/tags/list

返回

{"name":"centos","tags":["latest"]}

目前我只有唯一的tag latest

構建倉庫用的密碼文件:username 123abc是用戶名密碼

docker run --entrypoint htpasswd registry -Bbn username 123abc >> /registry-var/auth/htpasswd)

下面是完整的加上自定義配置文件、存儲目錄的命令了:

docker run -d -p 5000:5000 --restart=always -v /registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /registry-var/my_registry:/var/lib/registry/ -v /registry-var/config.yml:/etc/docker/registry/config.yml --name registry registry

docker run -d -p 5000:5000 --restart=always -v /registry-var/auth/:/auth/ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" -e "REGISTRY_STORAGE_DELETE_ENABLED=true" -v /registry-var/my_registry:/var/lib/registry/ --name registry registry

登陸測試:

docker login -u 用戶名-p 密碼 registry.x.com:5000

出來Login Succeeded

就是成功了 可以隨意push和pull了 當然 要加上registry.x.com:5000

比如 docker pull registry.x.com:5000/centos

刪除鏡像

首先獲取鏡像名和tag

獲取到鏡像名列表

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/_catalog

{"name":"centos","tags":["latest"]}

name就是景象名 tag 就是tag了 連接起來 用: 纔是具體的某個鏡像

根據鏡像名獲取tag列表 這裏是鏡像名centos 爲例

curl -u xxx:123abc -X GET http://registry.x.com:5000/v2/centos/tags/list

然後獲取digest_hash參數

curl -u xxx:123abc --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://registry.x .com:5000/v2/centos/manifests/latest

拿到:

{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 1833,
"digest": "sha256:3bee3060bfc81c061ce7069df35ce090593bda584d4ef464bc0f38086c11371d"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 72267384,
"digest": "sha256:d3aeceeb0289bf97c2474366cfcdaf66e29b409d45d6ed91be3335f16915f1b0"
}
]

根據某個sha刪除

(失敗 表現爲第二次運行可以發現不同的回覆信息 表示找不到

{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown"}]}

但是實際並無效果的樣子

curl -u xxx:123abc -X DELETE http://registry.x.com:5000/v2/centos/manifests/sha256:3bee3060bfc81c061ce7069df35ce090593bda584d4ef464bc0f38086c11371d

啓動倉庫容器的時候 加 -e "REGISTRY_STORAGE_DELETE_ENABLED=true"可以使得這句話第一次運行不報錯 否則報錯 說不支持的操作, 配置文件加不上delete 加了就報錯{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]})

刪除只能藉助官網提供的第三方腳本了
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image

回收數據(失敗 配置文件加不上delete 加了報錯 不加能運行但是並未刪除文件)

docker exec -it registry sh 進入registry容器內

在容器內執行:

registry garbage-collect config.yml

下面來自摘錄:

使用第三方刪除工具:
參考資料:https://github.com/burnettk/delete-docker-registry-image

安裝:
curl https://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py | sudo tee /usr/local/bin/delete_docker_registry_image >/dev/null
sudo chmod a+x /usr/local/bin/delete_docker_registry_image

指定本地倉庫的路徑,這裏用環境變量沒有起作用,所以使用了軟連接方式
sudo ln -s /docker_registry_dir/registryDir /opt/registry_data

如果沒有指定你的registry_data目錄,我使用了find
find / -type f -name "v2"
/var/lib/docker/volumes/8db47bbca74b1f70edb1be76adbe6b7b84bc78b893bc731e0393736d8cdc8844/_data/docker/registry/v2

刪除指定tag
sudo /usr/local/bin/delete_docker_registry_image --image mysql:latest
此時:
sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/_catalog

{"repositories":["mysql","swarm"]}

我的效果是:

看到mysql還在,但是其下面對應的tag已經不見了:

sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/mysql/tags/list

{"name":"mysql","tags":null}

刪除指定倉庫
sudo /usr/local/bin/delete_docker_registry_image --image mysql
刪除成功
sudo curl --cacert /docker_registry_dir/certs/domain.crt --basic --user admin:admin https://docker.registry.server:5000/v2/_catalog

{"repositories":["swarm"]}

[root@OPS-Test delete-docker-registry-image]# ./clean_old_versions.py --image --registry-url centos7.5.1804.basic http://localhost:5000/
/usr/lib/python2.7/site-packages/requests/init.py:80: RequestsDependencyWarning: urllib3 (1.22) or chardet (2.2.1) doesn't match a supported version!
RequestsDependencyWarning)
usage: clean_old_versions.py [-h] [-e EXCLUDE] [-E INCLUDE] -i IMAGE [-v]
[-u REGISTRY_URL] [-s SCRIPT_PATH] [-l LAST]
[-b BEFORE] [-a AFTER] [-o {name,date}] [-U USER]
[-P PASSWORD] [--no_check_certificate]
[--dry-run]
clean_old_versions.py: error: unrecognized arguments: http://localhost:5000/

上面的報錯是因爲爲兼容導致,通過下面的命令來解決。
pip uninstall urllib3
pip uninstall chardet
pip install requests

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章