我们正试图迁移到Docker以进行部署。我们的架构需要有一个redis,一个mongodb和几个nodejs以及基于java的Docker容器。
所以我的问题是,如果假设redis / mongodb docker容器崩溃,我们是否会丢失它拥有的所有数据?
我们希望隔离,但同时由于故障/崩溃,我们不希望丢失数据 。这甚至可以通过Docker实现这一点,还是与此无关?
非常感谢任何帮助或评论。
由于
答案 0 :(得分:5)
如果容器崩溃,您将不会丢失任何数据 - 至少不会超过常规应用程序崩溃。
容器本身不太可能崩溃(毕竟,它只是你的应用程序的信封)。您在容器中运行的应用程序可能会崩溃,如果他们这样做,他们的数据仍将在容器文件系统上。在这种情况下,您所要做的就是重启故障容器。
如果您明确告诉Docker在容器不再运行时将其删除(--rm
选项),则可能会丢失一些内容。
话虽如此,对于IO密集型应用程序(如数据库),强烈建议在Docker 卷上托管数据,但出于性能原因(docker volume 是传统的文件系统,而容器默认文件系统是一堆层,速度会慢一些。
答案 1 :(得分:4)
答案是:是 - 如果容器崩溃使其无法恢复/重新启动,则数据消失。但是,通常容器可以重新启动并继续 - 在这种情况下,数据不会丢失。
E.g。 - docker文档中的以下序列说明了容器启动的工作原理。请注意,在删除容器之前,数据不会丢失。
# Start a new container
$ JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")
# Stop the container
$ sudo docker stop $JOB
# Start the container
$ sudo docker start $JOB
# Restart the container
$ sudo docker restart $JOB
# SIGKILL a container
$ sudo docker kill $JOB
# Remove a container
$ sudo docker stop $JOB # Container must be stopped to remove it
$ sudo docker rm $JOB
每当执行docker run
命令时,都会启动一个包含新数据的新容器。数据基于您提供的图像并且数据是一致的(除非您重建图像当然)。
那么,您应该如何设置docker以保持数据的完整性?我认为一个好方法是将重要数据保存在volume
中。卷只是外部文件夹(即来自主机系统的文件夹),用于保存数据,即使重新安装整个docker守护程序,这些数据也不会丢失。
示例:
docker run -v /some/local/dir:/some/dir/in/redis-container my/redis
这会将主机文件夹/some/local/dir
挂载到正在运行的容器中的文件夹/some/dir/in/redis-container
。如果是redis
将其数据存储在您已设置的文件夹中,重新启动/崩溃可以存活。
有关docker volume的更多信息,请查看docs。另一篇很棒的文章也是来自docker网站的Managing Data in Containers。
编辑:评论后我澄清了答案 - 如果无法重新启动容器(完全崩溃),数据就会丢失。