删除docker镜像

随着我们拉取的镜像越来越多,镜像的管理越来越难。这时候可能就需要删除镜像了。

本关的任务是学习如何删除容器,要求学习者参照示例,将busybox:latest镜像删除。

相关知识

删除镜像

如果要删除本地的镜像,可以使用 docker rmi (注意rm为删除容器,而rmi为删除镜像,其中i代表image)命令,它的具体语法如下:

docker rmi [OPTIONS] IMAGE [IMAGE...]

其中:

  • docker rmiDocker删除镜像的命令关键词;
  • OPTIIONS: 命令选项,-f强制删除镜像;
  • IMAGE:需要删除的镜像。这里的镜像可以用“镜像短ID”、“镜像长ID”、“镜像名”、“镜像的digest”来标识。

使用docker images --digests查看镜像的具体信息,包括镜像的digest;如下图所示:

  1. [root@localhost Desktop]# docker images --digests ubuntu
    REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
    ubuntu latest sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f 14f60031763d 2 weeks ago 120 MB

删除ubuntu:latest镜像,有以下几种方法:

  1. 镜像短IDdocker rmi 14f6;(这个代表镜像id14f6开头的镜像,一般而言,前四位可以唯一标志,如果不可以,docker会提示的)
  2. 镜像长IDdocker rmi 14f60031763d
  3. 镜像名: docker rmi ubuntu:latest
  4. 镜像的digestdocker rmi ubuntu@sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f

以上的方法都能删除掉ubuntu:v1镜像。但日常生活中,我们比较常用的是短ID以及镜像名,因为用起来最方便。

删除多个镜像

我们可以使用 docker images -q来配合使用docker rmi,这样可以成批的删除希望删除的镜像。

docker images -q redis会输出所有仓库名为redis的镜像id,所以如果想要删除所有仓库名为redis的镜像,可以这么写:


docker rmi $(docker images –q redis)

如果想要删除所有镜像,可以这么写:


docker rmi $(docker images –qa)

如果想要使用docker rmi删除一个镜像,需要注意需要先将使用该镜像的容器删除掉,否则该镜像不能删除成功。当然也可以使用docker rmi -f强制删除该镜像!
 

扩展阅读(帮助理解镜像的存储机制)

首先拉取一个ubuntu镜像到本地(开始时本地没有任何镜像的)。

 
  
[root@localhost Desktop]# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
e0a742c2abfd: Pull complete
486cb8339a27: Pull complete
dc6f0d824617: Pull complete
4f7a5649a30e: Pull complete
672363445ad2: Pull complete
Digest: sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f
Status: Downloaded newer image for ubuntu:latest
[root@localhost Desktop]#
然后基于ubuntu:latest创建一个镜像,ubuntu:v1.0(Dockerfile看不懂没关系,你只需要该镜像是基于ubuntu镜像,而且构建了三层即可了)。


# [root@localhost Desktop]# docker build -t ubuntu:v1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1/2 : FROM ubuntu
---> 14760031763d
Step 2/2 : RUN touch 1.txt
---> f3caf7be8365
Removing intermediate container 8b1ddd72ce60
Successfully build f3caf7be8365

删除ubuntu镜像,发现只输出了Untagged


[root@localhost Desktop]# docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:84c334414e2bfdcae99509a6add166bbb4fa4041dc3fa6af08046a66fed3005f

删除ubuntu:v1.0,除了Untagged信息外,还有Deleted信息。

Untagged: ubuntu:v1.0
Deleted: sha256:f3caf7be8365d8565ccd
Deleted: sha256:ccb3e410a39a587a2221
Deleted: sha256:14760031763da664d5d6
Deleted: sha256:e48d2779c8c8c3200fac
Deleted: sha256:4c66a8c9cd74cd55b98b
Deleted: sha256:55cb055d70722e6f41bc
Deleted: sha256:28a900eeeb199b0ebc40
Deleted: sha256:e5d2f035d714888cfe23

因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以删除镜像标签的信息,这就是我们看到的Untagged 的信息。 而Deleted信息,是删除镜像层后输出的信息。

因为我们的ubuntu镜像对应了2个标签,因此当我们删除latest标签后,还有v1.0指向了这个镜像,而如果还有其他标签指向镜像层的话,那些镜像层是不会被删除的,所以docker rmi ubuntu只输出了Untagged信息。

当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。当执行docker rmi ubuntu:v1.0,首先将该镜像标签删除掉,所以先输出Untagged信息。因为所有标签都被取消了,所以会触发删除行为(也就是Deleted信息),将ubuntu:v1.0使用的所有镜像层都删除掉了。(实际上从输出信息看创建ubuntu:v1.0的时候只构建了三层,而删除ubuntu:v1.0时,删除了八层,其他的五层,就是ubuntu:latest构建时创建的层)。
 

#!/bin/bash
#以busybox:latest为基础镜像创建一个容器,容器名为container3
docker run --name container3 busybox echo "hello"
#然后将busybox:latest镜像删除
#********** Begin *********#
docker rmi busybox:latest
#********** End **********#

你可能感兴趣的:(docker,docker,容器,运维)