Stop VM with MongoDB docker image without losing d

2019-07-28 02:14发布

问题:

I have installed the official MongoDB docker image in a VM on AWS EC2, and the database has already data on it. If I stop the VM (to save expenses overnight), will I lose all the data contained in the database? How can I make it persistent in those scenarios?

回答1:

There are multiple options to achieve this but the 2 most common ways are:

  • Create a directory on your host to mount the data
  • Create a docker volume to mount the data

1) Create a data directory on a suitable volume on your host system, e.g. /my/own/datadir. Start your mongo container like this:

$ docker run --name some-mongo -v /my/own/datadir:/data/db -d mongo:tag

The -v /my/own/datadir:/data/db part of the command mounts the /my/own/datadir directory from the underlying host system as /data/db inside the container, where MongoDB by default will write its data files.

Note that users on host systems with SELinux enabled may see issues with this. The current workaround is to assign the relevant SELinux policy type to the new data directory so that the container will be allowed to access it:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir

The source of this is the official documentation of the image.

2) Another possibility is to use a docker volume.

$ docker volume create my-volume

This will create a docker volume in the folder /var/lib/docker/volumes/my-volume. Now you can start your container with:

docker run --name some-mongo -v my-volume:/data/db -d mongo:tag

All the data will be stored in the my-volume so in the folder /var/lib/docker/my-volume. So even when you delete your container and create a new mongo container linked with this volume your data will be loaded into the new container.

You can also use the --restart=always option when you perform your initial docker run command. This mean that your container automatically will restart after a reboot of your VM. When you've persisted your data too there will be no difference between your DB before or after the reboot.