首先,别忘记之前的两个问题:
1. 如何保存我们在容器里的修改?
2. 如果apt-get如果不能安装时,如何在Docker中安装软件?
删除镜像命令
在此之前,先记一个命令,
sudo docker rm ID/NAME
即删除创建的镜像.如
现在删除id为”cc8a23b1d624”的镜像.
sudo docker rm cc8a23b1d624
可以看到,id为cc8a23b1d624的镜像被删除了.
而且可以发现,本地的/var/lib/docker/containers目录下的对应目录也被删除了.
下面讨论Docker的数据持久化.
数据卷
数据卷的创建
官方的解释是:数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS.
UFS即是UNIX文件系统的简称.
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即使容器被删除
数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
如创建容器时使用参数v指定一个目录,
sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash
这样我们挂载了一个数据卷.如果/home/mungo/workspace/docker/container_data目录不存在,Docker会自动创建该目录.
上面的命令就是将container_data挂在到了容器的/data下.在容器中可以看到:
上次,了解到如何查看容器详情的方法,即:
sudo docker inspect DataTest
这里”DataTest”即是刚才创建容器指定的名称.上面返回的json格式的容器信息,查看Mounts节点数据.如下:
可以看到Mounts下正是我们创建时指定的目录.
这个功能十分方便,像之前的第二个问题–如果apt-get如果不能安装时,如何在Docker中安装软件?这时用户可以放置一些程序到本地目录中,然后就可以安装了。注意的是本地目录的路径必须是绝对路径。
比如我将一个文件vscode-amd64.deb复制到挂在的目录,然后在docker的容器中就可以直接看到了.
值得注意的是:Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。
sudo docker run -i -t --name DataTest -v /home/mungo/workspace/docker/container_data:/data:ro docker/whalesay /bin/bash
至此,之前的留下的问题算是解决了一个.
数据卷的数据共享
那么既然可以将本地的目录挂在到Docker容器中,挂载的数据卷是否可以再被其他的Docker容器使用呢?
sudo docker run -i -t --name DataTest2 -v /home/mungo/workspace/docker/container_data:/data docker/whalesay /bin/bash
可以发现name为”DataTest”和”DataTest2”的容器都是启动的.同时他们挂在了宿主主机的同一个目录,在各自的容器中看到的是一一致的.
然后在”DataTest2”创建一个文件–“test.txt “,在去查看”DataTest”的挂在目录和宿主本地的被挂载目录,发现新建的”test.txt”文件都存在.
之后再在”DataTest”修改文件”test.txt”增加”hello”.分别取三个地方查看,发现三个地方的结果是一致的.
数据卷的删除
通过上面的介绍可以了解到:数据卷是被设计用来持久化数据的.那么,它的生命周期和容器有什么关系?删除容器数据卷会不会被连带删除?
下面我退出容器DataTest2并删除它.
在容器DataTest和宿主本机本地中查看上面挂在的数据卷.
可以发现,在容器DataTest和宿主本机本地之前的更改都在.
所以,数据卷的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,同时也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。
如果需要在删除容器的同时移除数据卷。查到资料说可以在删除容器的时候使用 docker rm -v
这个命令。可是我尝试了没有成功,不知什么原因.
不过这些无主的数据卷可能会占据很多空间,要清理会很麻烦。但是Docker官方正在试图解决这个问题,相信以后会有简便的方法,关于这个问题的进度,现在可以查看这个Pull requests .
这次解决掉了如果apt-get如果不能安装时,如何在Docker中安装软件这个问题.可是关于Docker的学习,随着深入,月觉得还有很多东西需要了解.以后继续吧.