当docker容器崩溃时,数据会发生什么

时间:2014-12-30 07:26:20

标签: node.js mongodb redis docker

我们正试图迁移到Docker以进行部署。我们的架构需要有一个redis,一个mongodb和几个nodejs以及基于java的Docker容器。

所以我的问题是,如果假设redis / mongodb docker容器崩溃,我们是否会丢失它拥有的所有数据?

我们希望隔离,但同时由于故障/崩溃,我们不希望丢失数据 。这甚至可以通过Docker实现这一点,还是与此无关?

非常感谢任何帮助或评论。

由于

2 个答案:

答案 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

编辑:评论后我澄清了答案 - 如果无法重新启动容器(完全崩溃),数据就会丢失。