如何删除docker-register镜像及none无效镜像详解
背景介绍
我们大家在服务器上搭建了dockerregistry,所有的构建镜像都会集中在一个服务器上,久而久之硬盘就被塞满了。本文会着重介绍两种清理方式。一是
docker
有效的none镜像
为了理解
当我拉取一个stresser镜像的时候,运行dockerimages-a命令,会发现我凭空多出来一个
➜dockerimages-a REPOSITORYTAGIMAGEIDCREATEDSIZE stresserlatest68ee9b96793e9daysago242MBdbcff89522639daysago242MB
当我要删除这个
➜dockerrmidbcff8952263 Errorresponsefromdaemon:conflict:unabletodeletedbcff8952263(cannotbeforced)-imagehasdependentchildimages ➜dockerrmi68ee9b96793e Untagged:stresser:latest Deleted:sha256:68ee9b96793e0a3b3a77ec713f1bf4eb19446bd13fb933557dc401e452ca04c4 Deleted:sha256:dbcff895226371eba2640c178414f5828aa5e6f417978b63ffa490d3865dc79a Deleted:sha256:875a0b6d28d1f52fc980a0948055d3ec3a38158ff7aa6a1a2c19c4243b96a57a ➜dockerrmidbcff8952263 Errorresponsefromdaemon:Nosuchimage:dbcff8952263:latest
当我们pullstresser镜像的时候,最先下载的是dbcff8952263
{"id":"37dd4150474449629e8a7b576eed26cb8583d2fe5a3edf10fd84323dfd538678","parent":"5cf74bcb1bde2e2249824a682f45235954543a5d57081db22c96402342db49e9","created":"2017-04-06T16:28:35.51523979Z","container_config":{"Hostname":"","Domainname":"","User":"","Memory":0,"MemorySwap":0,"CpuShares":0,"Cpuset":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"PortSpecs":null,"ExposedPorts":null,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":null,"Cmd":["/bin/sh-cset-e;\u0009NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62;\u0009found='';\u0009forserverin\u0009\u0009ha.pool.sks-keyservers.net\u0009\u0009hkp://keyserver.ubuntu.com:80\u0009\u0009hkp://p80.pool.sks-keyservers.net:80\u0009\u0009pgp.mit.edu\u0009;do\u0009\u0009echo\"FetchingGPGkey$NGINX_GPGKEYfrom$server\";\u0009\u0009apt-keyadv--keyserver\"$server\"--keyserver-optionstimeout=10--recv-keys\"$NGINX_GPGKEY\"\u0026\u0026found=yes\u0026\u0026break;\u0009done;\u0009test-z\"$found\"\u0026\u0026echo\u003e\u00262\"error:failedtofetchGPGkey$NGINX_GPGKEY\"\u0026\u0026exit1;\u0009exit0"],"Image":"","Volumes":null,"WorkingDir":"","Entrypoint":null,"NetworkDisabled":false,"MacAddress":"","OnBuild":null,"Labels":null},"author":"NGINXDockerMaintainers\"docker-maint@nginx.com\"","Size":4901}
最后做一个总结::镜像是一种中间镜像,我们可以使用`dockerimages-a`来看到,他们不会造成硬盘空间占用的问题(因为这是镜像的父层,必须存在的),但是会给我们的判断带来迷惑。
无效的none镜像
另一种类型的
像Java和Golang这种编程语言都有一个内存区,这个内存区不会关联任何的代码。这些语言的垃圾回收系统优先回收这块区域的空间,将他返回给堆内存,所以这块内存区对于之后的内存分配是有用的
docker的悬挂(dangling)文件系统与上面的原理类似,他是没有被使用到的并且不会关联任何镜像,因此我们需要一种机制去清理这些悬空镜像。
我们在上文已经提到了有效的
用一个例子来讲解:
假设我们要构建一个新的镜像,Dockerfile文件如下
FORMUbuntu:latest RUNecho'helloworld'
当我们构建dockerbuild-thello-world./的时候,会生成一个新的镜像。
可是过了一个月之后,Ubuntu发布了新的镜像,这个时候我们再次构建一个helloworld镜像,会依赖于最新的Ubuntu
问题来了,我们引用旧的Ubuntu的hello-world镜像,这个时候就会成为没有标签的dangling镜像!使用下面的命令可以清理
dockerrmi$(dockerimages-f"dangling=true"-q)
docker没有自动垃圾回收处理机制,未来可能会有这方面的改进,但是目前我们只能这样手动清理(写个脚本就好)。
删除本地硬盘的镜像
当我们registry服务器存在很多tag标签的镜像,但是硬盘空间不够用的时候,我们会希望删除存量的镜像给服务器腾出空间,registry自带了API接口删除镜像,但是即使我们调用了,他也只是逻辑层面的删除,软删除(softdelete),只是把二进制和镜像的关系解除罢了,实际上镜像一直存在我们的硬盘中,我们需要一种方式彻底物理删除存量空间。网上有第三方的解决方案:delete-docker-registry-image,接下来列出操作步骤,操作之前先把registry服务停掉。
安装:
curlhttps://raw.githubusercontent.com/burnettk/delete-docker-registry-image/master/delete_docker_registry_image.py|sudotee/usr/local/bin/delete_docker_registry_image>/dev/null sudochmoda+x/usr/local/bin/delete_docker_registry_image
设置环境变量:数据存放地址:
我服务器上registry的配置如下:
volumes: -/root/docker-data/registry/data:/var/lib/registry
root@iZ94ft8hgzqZ:~/docker-data/registry/data/docker/registry/v2/repositories#ls-al total108 drwxr-xr-x27rootroot4096Aug2118:29. drwxr-xr-x4rootroot4096Oct302015.. drwxr-xr-x5rootroot4096Mar272016example drwxr-xr-x5rootroot4096Mar2019:25gitlab_ansible drwxr-xr-x5rootroot4096Mar222016hlpays-job drwxr-xr-x5rootroot4096Jan262016hlpays-oa drwxr-xr-x5rootroot4096Mar242016hlpays-portal drwxr-xr-x5rootroot4096Mar2718:32ifex-crm
exportREGISTRY_DATA_DIR=/root/docker-data/registry/data/docker/registry/v2
逻辑删除:
delete_docker_registry_image–imagetickets–dry-run;只是逻辑删除,没什么用,演示一下而已。。。
root@iZ94ft8hgzqZ:~/docker-data/registry/data/docker/registry/v2/repositories#delete_docker_registry_image--imagetickets--dry-run INFO[2017-09-1318:21:04,505]DRY_RUN:wouldhavedeleted/root/docker-data/registry/data/docker/registry/v2/blobs/sha256/27/27dedd9200ff607e76eb9d0e10beb103f53551e4ed39829d767cfbc208b79581 INFO[2017-09-1318:21:04,506]DRY_RUN:wouldhavedeleted/root/docker-data/registry/data/docker/registry/v2/blobs/sha256/1b/1b2aade332a7133b1a03cae7695a3dcf9413dd017ff41f35a1bb1506becbacf3
物理数据删除:
删除物理内存,能看到硬盘空间已经空出来了。
delete_docker_registry_image--imagetickets df-h
删除指定标签:
delete_docker_registry_image--imagetestrepo/awesomeimage:supertag
其他用法请参照官网
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。