【发布时间】:2017-06-30 13:19:32
【问题描述】:
我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 镜像,并且数据库中已经有数据。如果我停止 VM(以节省一夜之间的费用),我会丢失数据库中包含的所有数据吗?我怎样才能让它在这些情况下持久化?
【问题讨论】:
标签: linux mongodb docker amazon-ec2
我已经在 AWS EC2 上的虚拟机中安装了官方的 MongoDB docker 镜像,并且数据库中已经有数据。如果我停止 VM(以节省一夜之间的费用),我会丢失数据库中包含的所有数据吗?我怎样才能让它在这些情况下持久化?
【问题讨论】:
标签: linux mongodb docker amazon-ec2
有多种方法可以实现这一点,但最常见的两种方法是:
1) 在主机系统的合适卷上创建数据目录,例如/my/own/datadir。像这样启动你的 mongo 容器:
$ docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo:tag
命令的-v /my/own/datadir:/data/db 部分将底层主机系统中的/my/own/datadir 目录作为/data/db 挂载到容器内,默认情况下,MongoDB 将写入其数据文件。
请注意,启用 SELinux 的主机系统上的用户可能会遇到此问题。当前的解决方法是将相关的 SELinux 策略类型分配给新的数据目录,以便允许容器访问它:
$ chcon -Rt svirt_sandbox_file_t /my/own/datadir
来源是official documentation of the image。
2) 另一种可能性是使用 docker 卷。
$ docker volume create my-volume
这将在文件夹 /var/lib/docker/volumes/my-volume 中创建一个 docker 卷。现在您可以使用以下命令启动容器:
docker run --name some-mongo -v my-volume:/data/db -d mongo:tag
所有数据都将存储在my-volume 中,因此在文件夹/var/lib/docker/my-volume 中。因此,即使您删除容器并创建与此卷链接的新 mongo 容器,您的数据也会被加载到新容器中。
您还可以在执行初始docker run 命令时使用--restart=always 选项。这意味着您的容器将在您的 VM 重新启动后自动重新启动。如果您也保留了数据,那么您的数据库在重新启动之前或之后将没有区别。
【讨论】: