说起docker持久化我们就肯定会想到volume
这篇文章主要讲两个知识点
- docker运行镜像时进行持久化
- docker自动创建的volume
- 删除自动创建的volume
所用docker版本:
今天我在docker上拉取了一下mongodb,就顺便拿mongodb这个镜像来说明我发现的问题
拉取过程不再说了,直接运行我的mongo镜像
docker 运行镜像时进行持久化
注意:这里的持久化目录仅仅是mongo的持久化目录,不同镜像目录也会不同,这里只以mongo为例
docker run -d -p 27017:27017 -v /opt/docker/volume/mongo/db:/data/db -v /opt/docker/volume/mongo/config:/data/config --name mongo01 mongo:latest
启动后我们运行docker inspect mongo01,找到下边内容就说明我们持久化成功了,这两个目录会与我们容器中的数据保持一致,数据也就不会丢了,看到这里不要停,继续看你还会有收获
docker自动创建volume
但是我后来再次启动新容器时并没有进行挂载,但是我更改的数据在我重新启动docker后数据并没有变,这我就很奇怪了,我并没有进行持久化挂在呀,然后我就用docker volume ls进行查看,发现如下
这让我猜测到docker可能启动新容器时自动为我们创建了volume,图上的两个volume可能就是对应我的mongo config和db数据,接下来进行验证:
首先我仍然用docker inspect 新容器名查看我的信息,结果如下,也就是说这两个就是我的新容器的持久化挂载,而且文件是在我们的宿主机中,这更加证实了我的猜想:
我也听过docker要用命令进行持久化,难道我是新版的docker?然后我进入容器中(命令:docker exec -it 容器名 bash),使用mongo命令进入mongodb,然后对mongo进行如下操作,大致就是我创建了一个名为geo的collection
接下来就是印证持久化的重要作用之一:可以共享挂载数据。我执行如下命令再建一个容器(这次我是拿mongotest的自动创建的volume之一(以下这个是我觉得存db内容的volume),我是在volume所在文件夹下,所以没有用绝对路径)
docker run -d -p 27019:27017 -v adfabea14b0de580c2a4662610cdb173309529ce7fed263798bdfcea8e38d784:/data/db --name mongotest2 mongo:latest
启动后我们进入mongotest2的mongo中进行查看,可以看到我们看到了我们在mongotest中创建的collection,并通过共享volume共享给了新创建的mongotest2,猜想算是证实了
我们再看此时的volume list
可以看出第一行是多的,第二行就是我们上边共享的dbvolume,所以我猜第一行就是我们的mongotest2的config的持久挂载,当然可能不同镜像的挂载数量也不同吧,这里我只演示了mongo的,但重点是:docker自动为我们进行了持久化,而且我们也对持久化数据可以在容器间共享做了一下实践
删除自动创建的volume
docker自动创建的volume等容器删除后也不会进行删除,需要我们手动去删除,这里问题就出来了,我们怎么知道哪个volume是服务哪个容器,这个我目前还真没找到方法,当然如果容器存在可以用docker inspect命令,但容器不存在呢,这我们难道一个个排除得出哪volume服务的容器已经删除了?我们可以直接执行docker volume rm volume名称命令,如果该volume服务的容器还在就不能删除:
我们把容器删除再来看,就删除成功了: