初识DOCKER(5)–移除容器和镜像

上节中,运行了许多实例,因此系统中将留有大量的容器,既然已经从容器生成了镜像,那么这些容器就没有必要保留在系统中了,不再使用的容器将占用磁盘空间,我们可以看下:

#docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES
d737e18b1a8a    main:latest     "/bin/bash"    25 minutes ago   Exited (0)  20 minutes ago   gloomy_yalow
b4614c13af36    main:latest      "/bin/bash"  About an hour ago  Exited (0)  25 minutes ago  trusting_swartz
#du -h -d 0 d73*
161M    d737e18b1a8a8f7513ca0804496e071c615d8ff70edf9cbd80a42577bfc529a5
28K     d737e18b1a8a8f7513ca0804496e071c615d8ff70edf9cbd80a42577bfc529a5-init
#du -h -d 0 b46*
113M    b4614c13af367896691ef0c82debd79c341610a06d13336ed7bb01fabf035d9d
28K     b4614c13af367896691ef0c82debd79c341610a06d13336ed7bb01fabf035d9d-init

可见容器的磁盘占用虽然跟我们在实例中的操作有关但通常并不是很小,释放这部分空间将使磁盘的可用空间有一个可观的增长。

需要注意的是,docker ps -a可以将未运行的容器一并列出,若不增加这个参数,那些用过后就被丢弃的镜像不会显示出来。

上节中,我们曾将改动后的容器保存为一个新的镜像,既然我们能创建镜像,同样可以删除镜像。

正如之前所做的一样,使用docker images来看一下系统中存在的镜像。

#docker images
REPOSITORY    TAG    IMAGE ID        CREATED        VIRTUAL SIZE
main1        lastest     1a2cb3178840   About a minute ago 388.5 MB
main         latest      75c3f5961c2e    5 days ago        388.5 MB
centos        latest     2a332da70fd1    9 days ago        196.8 MB

 

删除下看看

#docker rmi main1:lastest
Error response from daemon: Conflict, cannot delete 75c3f5961c2e because the container 4b6051fdcb82 is using it, use -f to force
FATA[0000] Error: failed to remove one or more images

镜像没有删除,原因在于先前有基于该镜像运行过实例,实例退出后未删除实例生成的容器,而该容器基于此镜像。理清逻辑,就很好处理了:先将基于该镜像的容器4b6051fdcb82删除,随后删除该镜像即可

在docker中,有一些镜像是由多个匿名镜像组合而成的,其间存在依赖关系。回想一下初次从官方仓库获取centos镜像时的场景:

#docker pull centos
Pulling repository centos
eeb3a076a0be: Download complete
47d44cb6f252: Download complete
8aa7f4a1dd13: Download complete
e0f5867add13: Download complete
Status: Image is up to date for centos:latest

#docker images
REPOSITORY    TAG    IMAGE ID        CREATED        VIRTUAL SIZE
Centos         latest    eeb3a076a0be    2 weeks ago      196.7 MB

只有eeb3a076a0be是Centos镜像,而其余的三个镜像均为eeb3a076a0be所依赖的镜像,4个镜像一同组成了Centos的文件系统环境。(通过 docker images -a可查看到全部镜像)因此,在删除eeb3a076a0be之前,不能删除它所依赖的镜像,如若删除将导致Centos镜像(也就是eeb3a076a0be)不能启动。当我们试图删除其余三个镜像时,docker会拒绝删除以防止误操作,然而笔者碰到过docker虽然拒绝删除受依赖的镜像然而该镜像却还是从系统中消失的情况,因此对于有强迫症的各位来说,最好的方法莫过于遵守这2条规则:

  1. 为每个保存的镜像定义一个名字
  2. 除非必要,请使用docker images 而不是docker images -a

既然docker是通过差异保存来实现镜像的,那么能不能在宿主机的文件系统中通过删除镜像或者容器的相关的差异文件来删除容器或者镜像呢?我们从main镜像创建一个实例后退出,试着手工删除这个容器。

#docker run -it --name main2 main
0;@3cca3ee5e615:/[root@3cca3ee5e615 /]# exit
exit
root@dockertest:~# docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES
3cca3ee5e615    main:latest     "/bin/bash"    5 minutes ago     Exited (0)  5 minutes ago    main2
#cd /data/docker_instance/
#ls
aufs  containers  graph  init  linkgraph.db  repositories-aufs  tmp  trust  volumes
#cd aufs/
#ls
diff  layers  mnt
#ls diff
2a332da70fd138adb862334e01a9c0a2e35019a7faf2526b31f81c41c8d31c7e
3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b-init
75c3f5961c2e67ae078440688136843ea07c3a2cd3a0cc81d9e41244209a0c10
acf92a72da0bcc1eddfaede9d2d2f5684e35decd98694426cd5e8d4d16b47513
b48a20c39b28a40b4b4a5badff6e0be750acca61ca06a150d156b0f5da811ba5
c79ebe41b35ad980d18c4b055e7ee190aaf67f6fdc1881c98d37da89ae3fb1c1
#rm -rf diff/3cca3ee5*
#ls layers/
2a332da70fd138adb862334e01a9c0a2e35019a7faf2526b31f81c41c8d31c7e
3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b-init
75c3f5961c2e67ae078440688136843ea07c3a2cd3a0cc81d9e41244209a0c10
acf92a72da0bcc1eddfaede9d2d2f5684e35decd98694426cd5e8d4d16b47513
b48a20c39b28a40b4b4a5badff6e0be750acca61ca06a150d156b0f5da811ba5
c79ebe41b35ad980d18c4b055e7ee190aaf67f6fdc1881c98d37da89ae3fb1c1
#rm -rf layers/3cca3ee5*
#ls mnt
2a332da70fd138adb862334e01a9c0a2e35019a7faf2526b31f81c41c8d31c7e
3690474eb5b4b26fdfbd89c6e159e8cc376ca76ef48032a30fa6aafd56337880
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b-init
75c3f5961c2e67ae078440688136843ea07c3a2cd3a0cc81d9e41244209a0c10
acf92a72da0bcc1eddfaede9d2d2f5684e35decd98694426cd5e8d4d16b47513
b48a20c39b28a40b4b4a5badff6e0be750acca61ca06a150d156b0f5da811ba5
c79ebe41b35ad980d18c4b055e7ee190aaf67f6fdc1881c98d37da89ae3fb1c1
root@dockertest:/data/docker_instance/aufs# rm -rf mnt/3cca3ee5*
#cd /data/docker_instance/
#ls
aufs  containers  graph  init  linkgraph.db  repositories-aufs  tmp  trust  volumes
#ls containers/
3cca3ee5e615ff73c71b7f33723d7a01b96172a663843e0eb22e1064a50b5d2b
#rm -rf containers/3cca3ee5*
#service docker restart
#docker ps -a
CONTAINER ID    IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES

至此,容器已经从宿主系统中清除。在刚在命令中,我们在
$dockerdatadir/aufs/diff
$dockerdatadir/aufs/layers
$dockerdatadir/aufs/mnt
这3个文件夹中也看到了镜像ID同名的文件夹。因此,镜像也可以采用相同的方式手工删除。

 


  请注意,本站的所有文章均要求阁下在转载时注明出处和原作者,阁下转载本站文章即表示阁下同意并遵守此规程,除非特别注明转载出处,否则文章即为其发布者所著。本站及文章作者保留文章的著作权并有权在阁下违反上述规程时予以追究。

本文链接地址: 初识DOCKER(5)–移除容器和镜像

发表评论

您的电子邮箱地址不会被公开。

*