删除镜像时,可以使用镜像的 ID,镜像名或者镜像摘要进行删除。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest bb0eaf4eee00 2 days ago 72.9MB redis latest 84c5f6e03bf0 8 days ago 104MB nginx latest 7e4d58f0e5f3 8 days ago 133MB busybox latest 6858809bf669 10 days ago 1.23MB [node1] (local) root@192.168.0.18 ~ $ docker image rm bb0eaf4e Untagged: ubuntu:latest Untagged: ubuntu@sha256:cbcf86d7781dbb3a6aa2bcea25403f6b0b443e20b9959165cf52d2cc9608e4b9 Deleted: sha256:bb0eaf4eee00c28cb8ffd54e571dd225f1dd2ed8d8751b2835c31e84188bf2de Deleted: sha256:362bda1d1f9b8af533390c6046a74e279bccd5fb70472b5afd4ab4b8d40e10cf Deleted: sha256:832c9286fda134a08292f53028ff1d50dc232cef9317fd7e108e24c480c42217 Deleted: sha256:b2fd17df207168da45a6eefccbf58eca08d05b263b3eeb365b6e4b321b18cdc8 [node1] (local) root@192.168.0.18 ~ $ docker image rm redis Untagged: redis:latest Untagged: redis@sha256:1cfb205a988a9dae5f025c57b92e9643ec0e7ccff6e66bc639d8a5f95bba928c Deleted: sha256:84c5f6e03bf04e139705ceb2612ae274aad94f8dcf8cc630fbf6d91975f2e1c9 Deleted: sha256:302d9c99198ac9f8d56c5dae991b77a64e094626553e3cb601132f35d10ccb61 Deleted: sha256:9c18c8ee5ed59040373f1fe21b7071062be0c7a274331da22d4f29b30716a53e Deleted: sha256:f8e08eb76c8dbd0c01edda03625e0bd0a3c6521b780374b91d457d4f045aea5e Deleted: sha256:0df6c826b3b757c0c37e282245c139abc81ba1678a506eb5f8f68174ce2fbee1 Deleted: sha256:04ea7ac0e6e99e0aeec0cd44a9f99f516e2791e0918f35ca58296f664c05676a [node1] (local) root@192.168.0.18 ~ Untagged 和 Deleted如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类,一类是 Untagged,另一类是 Deleted。我们之前介绍过,镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。
因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。
当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变得非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。这就是为什么,有时候会奇怪,为什么明明没有别的标签指向这个镜像,但是它还是存在的原因,也是为什么有时候会发现所删除的层数和自己 docker pull 看到的层数不一样的原因。
除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
总结介绍了镜像的下载、查看、使用和删除。