使用MongoDB docker镜像停止VM而不会丢失数据

Art*_*uro 1 linux amazon-ec2 mongodb docker

我已在AWS EC2上的VM中安装了官方MongoDB docker镜像,并且数据库上已有数据.如果我停止VM(为了节省一夜之间的费用),我会丢失数据库中包含的所有数据吗?如何在这些场景中保持持久性?

lvt*_*llo 5

有多种方法可以实现这一目标,但最常见的两种方法是:

  • 在主机上创建一个目录以装入数据
  • 创建一个docker卷来装入数据

1)在主机系统上的适当卷上创建数据目录,例如/my/own/datadir.像这样启动你的mongo容器:

$ docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo:tag
Run Code Online (Sandbox Code Playgroud)

-v /my/own/datadir:/data/db命令的一部分/my/own/datadir将底层主机系统中的目录安装在/data/db容器内部,默认情况下MongoDB将写入其数据文件.

请注意,启用了SELinux的主机系统上的用户可能会遇到此问题.当前的解决方法是将相关的SELinux策略类型分配给新数据目录,以便允许容器访问它:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir
Run Code Online (Sandbox Code Playgroud)

这个的来源是图像的官方文档.

2)另一种可能性是使用泊坞窗卷.

$ docker volume create my-volume
Run Code Online (Sandbox Code Playgroud)

这将在文件夹中创建一个docker卷/var/lib/docker/volumes/my-volume.现在您可以使用以下命令启动容器:

docker run --name some-mongo -v my-volume:/data/db -d mongo:tag
Run Code Online (Sandbox Code Playgroud)

所有数据都将存储在my-volume文件夹中/var/lib/docker/my-volume.因此,即使您删除容器并创建与此卷链接的新mongo容器,您的数据也将加载到新容器中.

您还--restart=always可以在执行初始docker run命令时使用该选项.这意味着您的容器会在重新启动VM后自动重启.当您持久保存数据时,重新启动之前或之后数据库之间没有任何区别.