【Docker技术入门与实战】删除镜像


本文节选自《Docker技术入门与实战》,华章授权DockerOne发布本书样章,禁止以任何形式转载此文。

使用镜像的标签删除镜像

使用docker rmi命令可以删除镜像,命令格式为docker rmi IMAGE [IMAGE...],其中IMAGE可以为标签或ID。

例如,要删除掉dl.dockerpool.com:5000/ubuntu:latest镜像,可以使用如下命令:
$ sudo docker rmi dl.dockerpool.com:5000/ubuntu
Untagged: dl.dockerpool.com:5000/ubuntu:latest

读者可能会担心,本地的ubuntu:latest镜像是否会受到此命令的影响。无需担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像5506de2b643b的一个标签而已。

为保险起见,再次查看本地的镜像,发现ubuntu:latest镜像(准确地说,是5506de2b643b镜像)仍然存在:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 14.04 5506de2b643b 1 weeks ago 197.8 MB
ubuntu latest 5506de2b643b 1 weeks ago 192.8 MB

但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除该镜像。

假设本地存在一个标签为mysql:latest的镜像,且没有额外的标签指向它,执行docker rmi命令,可以看出它会删除这个镜像文件的所有AUFS层:
$ sudo docker rmi mysql:latest
Untagged: mysql:latest
Deleted: 9a09222edf600a03ea48bd23cfa363841e45a8715237e3a58cb0167f0e8bad54
Deleted: 4daeda4ad839a152a3b649672bd5135977d7f81866d3bc0e16d0af3f65cc8af6
Deleted: cf07a411bf0883bd632940e8108dac49c64456a47f7390507de5685bbd6daf85
Deleted: 4f513746df18b222a07bb8d76d4b6d29752ce5dcb69bfad0ce92e6c1449a3821
Deleted: 228ecd435c8a29d25b77999036701a27f2d67874c915bb8eb9fb175b1f98aa60
Deleted: 37e4b3932afa186924a09eab332bc8ebec3aac8bac074314ed9a2d1e94547f50
Deleted: 898883ccfcee705e440547e30e240cb025c12410d7c9e4d2bcb11973ba075975
Deleted: 0a09ddcf99b7fd8fcb3525c41b54696038ecf13677f4459f1c98c742ffa60ab2
Deleted: 35bc8591e39be5089265a093e234d13a4b155a01d2ab9e8904eafa81664fb597
Deleted: 857e856e4481d59ee88a4cdedd9aaf855666bd494fa38506e6788361c0af4cda


使用镜像ID删除镜像
当使用docker rmi命令后面跟上镜像的ID(也可以是ID能进行区分的部分前缀串)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:

先利用ubuntu镜像创建一个简单的容器,输出一句话“hello! I am here!”:
$ sudo docker run ubuntu echo 'hello! I am here!'
hello! I am here!

使用docker ps -a命令可以看到本机上存在的所有容器:
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e812617b41f6 ubuntu:latest "echo 'hello! I am h 13 seconds ago Exited (0) 12 seconds ago silly_leakey

可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:latest镜像创建的。

试图删除该镜像,Docker会提示有容器正在运行,无法删除:
$ sudo docker rmi ubuntu
Error response from daemon: Conflict, cannot delete 5506de2b643b because the container e812617b41f6 is using it, use -f to force
2014/10/16 18:10:31 Error: failed to remove one or more images

如果要想强行删除镜像,可以使用-f参数:
$ sudo docker rmi -f ubuntu
笔者不推荐使用-f参数来强制删除一个存在容器依赖的镜像,因为这样往往会造成一些遗留问题。

再次使用docker images查看本地的镜像列表,读者会发现一个标签为<none>的临时镜像,原来被强制删除的镜像换了新的ID继续存在系统中。
$ sudo docker images
REPOSITORY       TAG       IMAGE ID       CREATED        VIRTUAL SIZE
<none>         <none>    2318d26665ef  3 months ago        198.7 MB

因此,正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。首先删除容器e812617b41f6:
$ sudo docker rm e81
e81

此时再使用临时的ID来删除镜像,此时会正常打印出删除的各层信息:
core@localhost ~ $ docker rmi -f 2318d26665ef
Deleted: 2318d26665eff33e9f91c4c99036751afb40eb58f944a585372bec1407828ad3
Deleted: ebc34468f71dca9cb9937bf4c33062540bcacae148df8a70053bfd1acbecaa20
Deleted: 25f11f5fb0cb9e41531d1da8dc56351286427e070c536f7015fe76e4dae0a4bc
Deleted: 9bad880da3d219b10423804147d6982da1a7bb1e285777a4d746afca6215bebb
Deleted: 511136ea3c5a64f264b78b5433614aec563103b4d4702f3ba7d4d2698e22c158

此时查看本地镜像,读者会发现临时镜像已经被删除:
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

0 个评论

要回复文章请先登录注册