设为首页 收藏本站
查看: 817|回复: 0

[经验分享] docker删除仓库中的镜像

[复制链接]

尚未签到

发表于 2019-2-21 09:57:22 | 显示全部楼层 |阅读模式
  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




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675191-1-1.html 上篇帖子: Docker 容器连接 下篇帖子: 跟我一起学docker(14)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表