docker中删除images的命令是docker rmi,但有时候执行此命令并不能删除images

docker@boot2docker:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
php                 latest              d71bada8846a        8 days ago          489.8 MB
hello-world         latest              f1d956dc5945        2 weeks ago         967 B
docker@boot2docker:~$ docker rmi f1d956dc5945
Error response from daemon: Conflict, cannot delete f1d956dc5945 because the container 3e3f017a5df4 is using it, use -f to force
Error: failed to remove images: [f1d956dc5945]

可以看出,image并没有被删除,而且报错被占用,无法删除

查看docker的帮助会发现有两个与删除有关的命令rmrmi

rm Remove one or more containers
rmi Remove one or more images

这里有两个不同的单词,imagescontainer。其中images很好理解,跟平常使用的虚拟机的镜像一个意思,相当于一个模版,而container则是images运行时的的状态。docker对于运行过的image都保留一个状态(container),可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container使用docker commit命令将其保存为image然后运行。

回到之前的问题,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。

所以想要删除运行过的images必须首先删除它的container。继续来看刚才的例子,

docker@boot2docker:~$ docker ps -a
CONTAINER ID        IMAGE                COMMAND             CREATED             STATUS                   PORTS               NAMES
3e3f017a5df4        hello-world:latest   "/bin/bash"         2 weeks ago         Created                                      determined_newton
36fca46be557        hello-world          "/hello"            2 weeks ago         Exited (0) 2 weeks ago                       clever_bell

可以看出f1d956dc5945的image被3e3f017a5df4和36fca46be557的container使用着,所以必须首先删除该container

[yaxin@ubox ~]$docker rm 117843ade696
Error: container_delete: Impossible to remove a running container, please stop it first2014/03/22 16:36:44 Error: failed to remove one or more containers

这个时候删除镜像可能还会出现错误,比如:

Error: container_delete: Impossible to remove a running container, please stop it first2014/03/22 16:36:44 Error: failed to remove one or more containers

这是因为该container正在运行中(运行docker ps查看),先将其关闭

docker stop CONTAINER ID(具体的值)

然后再删除镜像,就会发现成功

docker@boot2docker:~$ docker rmi  f1d956dc5945 
Untagged: hello-world:latest
Deleted: f1d956dc5945042a7aa18067346f1c2f1b47f39590a53f23e009600d5a9b3f49
Deleted: d59cd4c39e502ebb7eabe6b49eb0b5e19d38dede67540c51a27b5426c0976f4e
docker@boot2docker:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
php                 latest              d71bada8846a        8 days ago          489.8 MB

可以看出,image已经被删除。


总结:删除镜像之前,要确保该镜像没有正在运行(可以通过命令:docker ps 来查看),以及运行过被保存记录全部删除(可以通过命令:docker ps -a