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

Soh*_*ail 4 mongodb redis node.js docker

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

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

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

任何帮助或评论将不胜感激.

谢谢

was*_*ren 5

答案是:是 - 如果容器崩溃而无法恢复/重新启动,则数据将消失。但是,通常容器可以重新启动并继续 - 在这种情况下,数据不会丢失。

例如 - 来自 docker docs 的以下序列说明了容器启动的工作方式。请注意,在移除容器之前,此处的数据不会丢失。

# 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
Run Code Online (Sandbox Code Playgroud)

每当您执行docker run命令时,您都会使用新数据启动一个新容器。数据基于您提供的图像并且该数据是一致的(当然除非您重建图像)。

那么,您应该如何设置 docker 以保持数据完整?我认为一个好的方法是将重要数据安装在volume. 卷只是保存数据的外部文件夹(即来自主机系统的文件夹),即使您重新安装整个 docker 守护程序,这些数据也不会丢失。

例子:

docker run -v /some/local/dir:/some/dir/in/redis-container my/redis
Run Code Online (Sandbox Code Playgroud)

这会将主机文件夹安装/some/local/dir/some/dir/in/redis-container正在运行的容器中的文件夹。例如,如果redis将它的数据存储在该文件夹中,您就可以开始使用并且重新启动/崩溃可以幸免于难。

有关 docker 卷的更多信息,请查看文档。另一篇很棒的文章也来自 docker 网站,Managing Data in Containers

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


mba*_*emy 5

如果容器崩溃,您将不会丢失任何数据 - 至少不会超过常规应用程序崩溃.

容器本身不太可能崩溃(毕竟,它只是你的应用程序的信封).您在容器中运行的应用程序可能会崩溃,如果这样,他们的数据仍将在容器文件系统上.在这种情况下,您所要做的就是重新启动发生故障的容器.

你可能会失去一些东西的一种情况是你明确告诉Docker在它不再运行时移除容器(--rm选项).

如此说来,对于IO密集型应用,例如数据库,强烈建议主办多克尔数据,出于性能原因(码头工人体积是传统的文件系统,而容器默认文件系统是层的堆叠,并且将比较慢).