随着我们拉取的镜像越来越多,镜像的管理越来越难。这时候可能就需要删除镜像了。
本关的任务是学习如何删除容器,要求学习者参照示例,将busybox:latest
镜像删除。
如果要删除本地的镜像,可以使用 docker rmi
(注意rm
为删除容器,而rmi
为删除镜像,其中i
代表image
)命令,它的具体语法如下:
docker rmi [OPTIONS] IMAGE [IMAGE...]
其中:
docker rmi
:Docker
删除镜像的命令关键词;OPTIIONS
: 命令选项,-f
强制删除镜像;IMAGE
:需要删除的镜像。这里的镜像可以用“镜像短ID
”、“镜像长ID
”、“镜像名”、“镜像的digest
”来标识。使用docker images --digests
查看镜像的具体信息,包括镜像的digest
;如下图所示:
[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
镜像,有以下几种方法:
ID
:docker rmi 14f6
;(这个代表镜像id
以14f6
开头的镜像,一般而言,前四位可以唯一标志,如果不可以,docker
会提示的)ID
:docker rmi 14f60031763d
;docker rmi ubuntu:latest
;digest
:docker 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 **********#