在Docker中提交正在运行的容器是否“安全”?

10

正如标题所述,安全意味着...合适的方式?

安全=一致性、无数据丢失、专业、合法的方式。

希望与专业的Docker用户分享一些经验。

问题:提交Commit对于运行Docker容器来说是安全的(除了快速变化的实时内容和数据库内容外,欢迎您的评论)。

接受带有评论的是或否回答。谢谢。


1
也许我对之前类似问题所做的回答可以帮到您:http://stackoverflow.com/questions/24071148/is-it-safe-to-export-tarball-of-running-docker-container - mbarthelemy
1个回答

9
所有的内存和硬盘存储都保存在容器实例内。只要您不使用任何外部挂载 / Docker 卷和服务器(外部连接的数据库?),就不会因停止 / 重启和提交 Docker 而出现问题。请继续阅读,以深入了解此主题。
您可能想要最初问自己的一个问题是,Docker如何存储其运行时对磁盘所做的更改?真正有趣的是,Docker 实际上是如何管理使其工作的。容器硬盘的原始状态是从镜像中提供给它的。它不能写入该镜像。与其写入镜像,将创建一个差异层,以比较容器内部状态与 Docker 图像中的状态的差异。 Docker 使用一种名为 "Union Filesystem" 的技术,在 Docker 图像的初始状态之上创建差异层。
这个"diff"(在下面的图像中被称为可写容器)存储在内存中,并且在删除容器时消失。当您使用docker commit时,保留在容器的临时“状态”中的可写容器将存储在新镜像中,但我不建议这样做。您的新docker镜像的状态没有在dockerfile中表示,并且不能轻松地从重建中再生。编写新的dockerfile不应该很难。所以对我来说,这总是一种方法。
当您的docker与挂载的卷、外部服务器/数据库一起工作时,您可能希望确保不会失去同步并且暂时停止容器内的服务。当您使用dockerfile时,可以在容器内启动引导shell脚本,以启动连接、执行检查并初始化运行进程,以使应用程序持久设置。同样,运行已提交的容器会使此类操作更加困难。

Union Filesystem


你确定Docker会在容器内部节省内存吗? - anatoly techtonik
在运行时,容器内的进程被分配内存,与停止的容器一样,当容器停止时,内部运行的进程不再保留内存,我认为必须将其保存到磁盘中,以便容器可以重新启动。 - RoyB
我希望能够提供一些关于这种行为的证明链接,因为在我的设置中,“nginx”进程无法持久化保存在容器中。 - anatoly techtonik
很奇怪,我从来没有遇到过这些问题。你能发一个新的问题并在这里发送链接吗?回到我的观点:证明很简单,计算机只有RAM和ROM(磁盘)。当进程能够恢复其RAM状态时,获取数据的唯一资源就是磁盘。你应该能够在/var/lib/docker中找到交换文件。 - RoyB
当我运行 sudo nginx 时,它不会持久化,因此我需要在末尾使用 CMD sudo nginx -g 'daemon off;'。你可以自己测试一下。 - anatoly techtonik
RUN 用于向 IMAGE 添加更改,而不是 CONTAINER,您永远不应该运行可执行文件,除非只是为了补充对图像的更改,您应该始终使用 CMD,并在前台运行可执行文件。如果您不理解我为什么这样说,那么您就不理解“容器”的概念。 - RoyB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接