当 docker 容器崩溃时数据会发生啥

Posted

技术标签:

【中文标题】当 docker 容器崩溃时数据会发生啥【英文标题】:What happens to the data when a docker container crashes当 docker 容器崩溃时数据会发生什么 【发布时间】:2015-02-26 08:54:09 【问题描述】:

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

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

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

任何帮助或 cmets 将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

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

例如- 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 卷的更多信息,请查看docs。另一篇很棒的文章也来自 docker 网站,Managing Data in Containers。

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

【讨论】:

谢谢@wassgren 我一直在怀疑这一点。但我想知道如果我使用卷会不会有任何显着的性能损失?我不确定它是如何工作的。内核是否将信息传递给主机内核,然后保存数据。如果是这样,它会是一个有效的解决方案吗? 卷比 Docker 容器使用的分层文件系统更快。但是请注意,此答案的第一句话是错误的;尝试按照 mbarthelemy 的说法重新启动它。 @Bryan,感谢您的意见!我认为 crash 是不可恢复的。我已经更新了答案以反映这一点。 不完全是你仍然可以做 docker cp 或者去 Docker 的层上找到你的文件【参考方案2】:

如果容器崩溃,您不会丢失任何数据 - 至少不会比普通应用程序崩溃更多。

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

您可能会丢失某些东西的一种情况是,如果您明确告诉 Docker 在容器不再运行时删除它(--rm 选项)。

话虽如此,对于数据库等 IO 密集型应用程序,出于性能原因,强烈建议将数据托管在 Docker volumes 上(docker volume 是传统的文件系统,而容器默认的文件系统是一堆层,会比较慢)。

【讨论】:

谢谢@mbarthelemy 我会看看 docker 卷。 顺便说一句,正如@wassgren 所说,如果容器崩溃,您将丢失数据,但如果您使用卷则不会。希望我是对的。

以上是关于当 docker 容器崩溃时数据会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

当活动崩溃时会发生啥?

当 RabbitMQ 消费者崩溃时,获取的消息会发生啥?

当孩子定义另一个镜像时,Docker 父镜像的入口点会发生啥?

当我们扩展 kubernetes 部署并更改其中一个 pod 或容器配置时会发生啥?

系统崩溃时 H2 数据库缓存会发生啥?

当 printf 没有指定格式说明符时会发生啥?