尝试使用 Docker 管理的卷将 MongoDB 存储到卷上

当我在本地处理数据时,我尽量避免污染环境,所以在设置数据库服务器时,我尽量使用Docker容器。但是,这是我第一次尝试使用Docker Volumes来永久保存MongoDB数据。

迄今为止,我只使用了所谓的Bind Mounts(官方所说的)来实现Docker容器内的数据持久化,因此对于出现了Docker Managed的方法并不了解。只是出于好奇,试着使用了一下,感受还不错。

目前的最佳做法是使用 Docker Volumes,但根据具体的使用情况来选择,所以最好仔细考虑后再做选择。

这次我进行了一个流程,即在从网站爬取的数据以 JSONLines 格式存放在文件中时,将该文件通过 mongoimport 导入 Docker Volume 中,并确认该数据即使在删除 MongoDB 服务器容器后也得以永久保存。以下是该流程的笔记。

环境

Ubuntu 16.04
Docker 版本 17.12.0-ce,构建版本 c97c6d6

创建Docker卷

我将尝试以名称”mongodb_volume”创建一个重要的卷。

$ docker volume create mongodb_volume

创建DB服务器容器。

使用 MongoDB 的映像。
由于将 dbpath 设置为 /data/db,因此需要将上述创建的 Docker Volume 挂载到该目录中。

$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest

数据导入

使用官方的 MongoDB 映像来导入数据。
重新启动 mongo 容器时,请使用上述服务器容器的名称 mongodb 进行链接指定。
然后,在命令行上,通过链接将主机上的主目录中的 data.jsonl 文件导入到名为 my_db 的数据库和名为 my_col 的集合中。

$ docker run --rm --link mongodb:mongodb -v $HOME:/workspace mongo:latest mongoimport -h mongodb -d my_db -c my_col --file /workspace/data.jsonl

当导入成功后,容器应该会被关闭。

重启并关闭DB服务器容器。

我将尝试删除服务器容器,并重新启动一次。

$ docker stop mongodb
$ docker run -d --rm --name mongodb --mount source=mongodb_volume,target=/data/db -p 27017:27017 mongo:latest

确认数据

$ docker run -it --rm --link mongodb:mongodb mongo:latest mongo mongodb://mongodb
> use my_db
> db.my_col.find()

最后,如果能成功启动容器并通过Mongo Shell进行查询,返回正确的结果就可以了。
在进行备份和还原时,似乎只需要注重位于/var/lib/docker/volumes/的目标位置即可。
说实话,像这次这种情况,即使使用Bind Mounts也完全没有问题,但是了解一下这个方法也无妨,不会有任何损失……吧。