- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章docker镜像完全卸载的操作步骤由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1.docker ps -a查看运行的镜像进程 。
1
2
3
4
5
|
[root@mylinux~]
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98acb9dcb2a2 redis:5
"docker-entrypoint.s…"
8 minutes ago Up 8 minutes 0.0.0.0:6379->6379
/tcp
redis
1b1ff7f08583 mysql:5.7
"docker-entrypoint.s…"
8 minutes ago Up 8 minutes 0.0.0.0:3306->3306
/tcp
, 33060
/tcp
mysql
035129f60a64 mongo:3.6
"docker-entrypoint.s…"
8 minutes ago Up 8 minutes 0.0.0.0:27017->27017
/tcp
mongo
|
2.docker stop CONTAINER ID例如要删除mysql镜像,停止该镜像进程 。
1
|
docker stop 035129f60a64
|
3.docker rm CONTAINER ID卸载镜像 。
1
|
docker
rm
035129f60a64
|
4.docker images 查看当前docker的镜像IMAGE ID 。
1
2
3
4
5
|
[root@mylinux ~]
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 5 a4fe14ff1981 25 hours ago 95MB
mysql 5.7 7faa3c53e6d6 29 hours ago 373MB
mongo 3.6 0f29e46dab41 2 days ago 432MB
|
5.docker rmi IMAGE ID 删除镜像 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@mylinux ~]
# docker rmi 7faa3c53e6d6
Untagged: mysql:5.7
Untagged: mysql@sha256:204f5c77fe589c202e2ebc8b6b7dcdc442d67c07168916a302ede26b3e9ab168
Deleted: sha256:7faa3c53e6d699fe92d49a361e427c3af937c6cea9517f092e8013b1fff1c4d9
Deleted: sha256:bada5edfe9c6f4637d3ef1f4797561867be56282a750c0f1d4a83c227bc7a153
Deleted: sha256:cb6436acc7f930ab22d387016b2296e6c191fc4ebbb1611f84e3e15073588fc7
Deleted: sha256:1716d22cd68158fa78c60cf78d8e25457fb384de45de7775abf3a31502b6f00e
Deleted: sha256:daeb1195813697ab0182eb75de7f5a0f5bbfc4f8eb91be9f844777841e759984
Deleted: sha256:64ffa0ccfe7f5ecb4fb721913499a8e0b1af9897b69a0dbec0922f5b70666e76
Deleted: sha256:3b3af32bd87b74f389198eab8514d9f32f3e513dae313748b165333b286bd171
Deleted: sha256:c75ab456a585af40ca2ec8488164230deb81a1739d868604cb7b6661c24e37b5
Deleted: sha256:50a75eb6a0b2254fe5d96f999cc2087e72d515c93509a816bbd9ffb707a3b1b0
Deleted: sha256:1ae6616333a66450738a72a75c03bdf0236e0425ba0336ac5cdbe470ab6f4a3e
Deleted: sha256:68e318bd9263aedd19d9d73b051a262fa57e2a16f9c81c8b39163601020cd405
Deleted: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4
|
补充:Docker彻底删除私有库镜像 。
首先看看网上一般的做法 。
私有库默认是不支持删除镜像的,需要修改config.yml配置文件,在storage节点下加入 delete: enabled: true ,然后重启私有库.
docker 提供的镜像删除api为:
1
|
DELETE ip:端口
/v2/
<repository>
/manifests/
<reference>
|
repository 为镜像的repository 。
reference 为镜像push成功后生成的 digest:sha256 值 。
获取 digest
1
|
curl --header
"Accept: application/vnd.docker.distribution.manifest.v2+json"
-I -XGET <私有库ip>:端口号
/v2/
<镜像repository>
/manifests/
<镜像tag>
|
注意:
--header "Accept: application/vnd.docker.distribution.manifest.v2+json" 这个header 是必须要加的,不加的话Content-Type 是v1+prettyjws,获取的digest是错误的!! 。
例:curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -XGET 192.168.120.107:5000/v2/my-registry/manifests/1.0 。
删除镜像
例:curl -I -X DELETE http://192.168.120.107:5000/v2/my-repository/manifests/sha256:4d523adb3c653bab7dfd0326081860b3cba24dc393f69d6731daa513c435ec0c 。
删除后我们查看下私有库 。
1
|
curl 192.168.120.107:5000/ v2
/my-repository/tags/list
|
就会发现刚删除的那个tag不见了。但是如果在执行命令的前后车库内私有库镜像存储目录的文件大小,会发现并没有多大的变化 。
显然数据并没有被真的删除,我们还需要运行docker提供的垃圾回收命令.
垃圾回收 。
我们需要登录 私有库所在的服务器,然后执行命令:
1
|
docker
exec
-it <私有库的容器ID或者容器名> sh -c
' registry garbage-collect /etc/docker/registry/config.yml'
|
当然,也可以进入到私有库的容器中,再执行:
docker exec -it <私有库的容器ID或者容器名> sh 。
1
|
registry garbage-collect
/etc/docker/registry/config
.yml
|
这种方法特别麻烦,只能删tag,不会删repository,删除之后会在blobs目录下留下很多空文件夹,而且如果一个repository下有多个tag,而这些tag的数据相同的话,删除其中一个tag会同时把所有tag都删了 。
虽然网上有删除私有库镜像的python脚本,但是我感觉并不好用.
我是不会满足于此的,于是我自己写了个sh脚本,先来看看效果.
脚本还有一些人性化的提示,而且sh脚本通俗易懂,容易扩展,脚本我也上传到gitHub上了,有兴趣的可以下载试试.
gitHub地址:https://github.com/hushuai86/docker-delete 。
下载运行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#先下载脚本到/usr/local/bin/目录下
curl https:
//raw
.githubusercontent.com
/hushuai86/docker-delete/master/docker-delete-2
.0.sh |
sudo
tee
/usr/local/bin/docker-delete
>
/dev/null
#赋予可执行权限
chmod
a+x
/usr/local/bin/docker-delete
#私有库镜像存储目录路径全局环境变量(该路径就是运行私有库容器时,用-v 命令将私有库容器内 /var/lib/registry目录挂载到本机的路径)
#例: /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录
echo
"export DOCKER_REGISTRY_DIR=/opt/data/registry"
>>
/etc/profile
#运行私有库容器ID全局环境变量设置(正在运行的私有库容器的 ID)
#例: 89b9b3c9054ay是我的私有库库容器的id
echo
"export DOCKER_REGISTRY_CONTAINER_ID=89b9b3c9054a"
>>
/etc/profile
#使配置生效
source
/etc/profile
|
然后就可以使用docker-delete命令了,如果你觉得脚本有哪些用着不舒服的地方,可以编辑脚本自己改改 。
原理解析:
(在以下的截图中 /opt/data/registry是我运行容器时私有库镜像存储目录挂载到本地的目录) 。
私有库镜像存储目录下有两个文件夹 blobs和 repositories 。
其中repositories目录下是以镜像repository命名的几个文件 。
也就是说想要知道私有库有哪些镜像,直接看这个文件夹有哪些子文件夹就知道了 。
而在每个镜像repository文件夹/_manifests/tags目录下可以 看到该镜像有哪些tag 。
但是镜像的真实数据并不在repositories目录下,而是以数据块的方式存储在blobs目录下,一个镜像被分成多个数据块,也就是执行垃圾回收命令时输出的 ‘marking blob …‘那样的关联关系,而镜像和数据块之间的关联关系就是在 repositories/镜像 。
repository/_manifests/revisions/sha256/ 目录下的sha256值.
在以sha256值命名的目录下有个link的文件,内容就是这个sha256值 。
经过我测试发现,只要这个link文件被删除,然后在私有库容器内执行垃圾回收命令‘ registry garbage-collect /etc/docker/registry/config.yml',那么这个sha256值关联的blobs就会被彻底删除 。
但是,一个镜像可能有很多个tag,那么这个sha256值关联的 blobs数据 到底属于哪个 tag呢?
我们进到镜像的某个tag/index/sha256/ 目录,会发现 有个 sha256值命名的文件夹,而且这个sha256值 在之前的revisions/sha256/ 下存在。在这个文件夹下也有个link文件,保存了该sha256值.
所以根据我的理解,当我们调用docker提供的API 删除一个tag时,会在这个镜像的tag/index/sha256/<sha256值>/link文件中获取sha256值,然后看是不是还有其他tag也关联了这个sha256值,如果有的话,只删除这个tag文件夹,如果没有的话,那么在删除这个tag的文件的同时还会删掉 revisions/sha256/ 目录下的 改sha256对应的link文件,这样的话,当在容器内执行垃圾回收的命令时,就会彻底删除该sha256值关联的blobs数据.
特别注意:
在彻底删除一个镜像的数据后,需要重启下私有库容器,如果不重启的话,你再push该镜像到私有库时,总是会输出 Layer already exists ,似乎是push上去了,但是如果你删除本地的该镜像,然后再pull ,就会报错。当然,我写的脚本里是有这个步骤的 。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我。如有错误或未考虑完全的地方,望不吝赐教.
原文链接:https://blog.csdn.net/u014609263/article/details/90032514 。
最后此篇关于docker镜像完全卸载的操作步骤的文章就讲到这里了,如果你想了解更多关于docker镜像完全卸载的操作步骤的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是在项目中使用 keras 的新手。我一直在我的模型中使用generator。 我真的很困惑我应该输入什么值 1) In fit_generator : steps_per_epoch & vali
假设我们有如下情况: A has to give $10 to B. B has to give $20 to C. C has to give $10 to D. 现在这种情况可以简化为: A lo
我正在尝试对特定列(在工作表“OA”中)进行相对引用,我需要在 110 的步骤中检索新工作表中的单元格内容 例如, =OA!$AB217 =OA!$AB327 =OA!$AB437 与其在每个单元格中
我的 PowerShell 控制台启动时间很慢(总是等待超过 5 秒),并且希望获得有关故障排除步骤的建议,以找出瓶颈可能在哪里? 我已经阅读了关于运行脚本的内容,-NoProfile防止模块等加载很
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
我在 NativeScript 应用程序中使用 slider 小部件,我想知道是否有步骤属性。在我的例子中,小部件代表金钱,我希望以 5 美元的增量滑动。 我查看了文档,但找不到任何对这种情况有帮助的
这是我的code : &n
为什么 (2) c.ERR(模棱两可)?第一个方法参数 - char ('a') 被扩展为 float => 匹配。 如果找到匹配项,是否无需继续执行第 2 步(装箱/拆箱)或第 3 步(尝试可变参数
我有一个函数,它处理一个包含 6100 个列表项的列表。当列表只有 300 个项目时,该代码可以正常工作。但是立即与 6100 崩溃。有没有一种方法可以遍历这 6100 个项目,一次说 30 个,然后
1.制作PHP安装程序的原理 其实PHP程序的安装原理无非就是将数据库结构和内容导入到相应的数据库中,从这个过程中重新配置连接数据库的参数和文件,为了保证不被别人恶意使用安装文件,当安装
我创建了一个类似于 primeNG page 的步骤组件我想把他放在一个 dynamic dialog 里面但在应用它之后,“第 1 步”和“第 2 步”不会呈现。 查看代码,我发现关键部分是我们打开
我在理解描述的 MixColumns 步骤时遇到问题 here . 我知道扩散,这一切都是有道理的,因为它指出每列都被视为多项式并乘以 GF(2^8) 的模。 但是..乘以GF(2 ^ 8)。尽管域仍
根据我对 TeamCity 工作原理的观察,我注意到在所有步骤执行完毕后评估构建失败条件。这很烦人,因为如果满足任何构建失败条件,我不能有一个不会执行的步骤。 我不是指常见的构建失败条件,例如“至少一
基于这篇试图在我的环境中测试管道代码的帖子。但它给出了以下错误消息。如何修复他的管道代码? ERROR: Unable to find project for artifact copy: test
我参与了一个项目,需要向我的一位同事提供生产数据的子集(日期范围),以进行故障排除。我想将经过清理的生产数据子集插入新的数据库表中我的同事可以访问。请提出实现此目标的最佳方法。 最佳答案 最简单的方法
我有这样的场景: 鉴于我去这个页面 当我输入 cucumber 时 然后我点击 然后我应该看到文字 我不应该看到这条线 如果我运行这个场景,它将执行所有 5 个步骤。但是我想跳过第4步(然后我应该看到
是否有任何功能可以避免 m 文件的绘图输出? 我的意思是我在文件的开头放置了一个函数(如 clc),然后所有绘图函数都被阻止。 最佳答案 您可以使用自己的(嵌套在您的函数内或同一目录中)重载内置绘图函
我是小 cucumber 语言的新手,这在我看来是非常基本的问题,但我找不到答案。 我知道可以在 Gherking 中编写多行步骤参数,如下所示: Given a blog post named "R
即使其中一个步骤失败,有没有办法继续执行 Cucumber Steps。在我当前的设置中,当一个步骤失败时, cucumber 会跳过剩余的步骤......我想知道是否有某种方法可以设置 cucumb
start-step-stop 码是一种数据压缩技术,用于压缩相对较小的数字。 该代码的工作原理如下:它具有三个参数,start、step 和 stop。 Start 确定用于计算前几个数字的位数。
我是一名优秀的程序员,十分优秀!