【问题标题】: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 将不胜感激。

谢谢

【问题讨论】:

    标签: node.js mongodb redis docker


    【解决方案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 所说,如果容器崩溃,您将丢失数据,但如果您使用卷则不会。希望我是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多