我的问题旨在验证并纠正我对Docker容器可靠性的看法。我在Dockerfile中读取了Docker文档和几篇关于VOLUME
的文章,并在运行容器时将--v
作为参数,作为将数据保存在Docker容器之外的方法。无论是在数据容器中还是在主机系统上。由于我希望简化设置的复杂性,我宁愿不复制/保存/存储数据,也不要将其保存在Docker容器中。
有几种情况我通过它发现了Docker容器的行为。我想知道我是否错过了一个容器可以100%无意中丢失的情况,即没有做$ docker rm -f mycontainer
docker命令用于暂停,停止和终止容器
- >可以$ docker restart mycontainer
或$ docker run mycontainer
主机系统重启 - > docker container退出0或255
主机系统意外断电 - >会发生什么?
应用程序异常 - > docker container以-1
更新或重启docker(正如Greg所指出) - >预期行为:如系统重启(?)
在所有这些情况下,Docker容器最终仍然存在。那么是否有任何其他方案可能导致Docker容器丢失,就像$ docker rm -f mycontainer
一样?
背景是,我在Postgres的主机系统上阅读了很多有关挂载卷和外部数据存储的内容,但我想避免在可能的情况下将数据存储在主机系统上的容器之外。另一方面,我不想醒来并丢失所有数据。 (我确实执行常规的SQL转储,但我不想每5分钟执行一次)。如果一个docker容器本身对于持久性数据不可靠,我不明白为什么我应该创建第二个容器来保存第一个容器的数据,并通过添加一个新的容器来增加系统的复杂性但是没有获得任何条件可靠性。
编辑:Docker userguide on Volumes中有两点没有明确说明预期的行为,因此让我怀疑这些概念是否提供了额外的可靠性:
更新时,不会包含对数据卷的更改 图片 - > 这是否意味着它们会丢失或者卷的内容不会被更改?
卷一直存在,直到没有容器使用它们 - > '使用'的定义是什么?只要一个容器没有停止,杀死,移除?这是否意味着在主机系统上创建的Docker卷将被删除?或者卷仅引用Docker内的目录与主机系统上的目录之间的虚拟桥接?
答案 0 :(得分:0)
如果您将所有数据存储在容器中,当您需要更新图像时,您打算做什么?通常通过更改Dockerfile并重建映像来完成对映像的更新。如果我的数据与我的容器分开,我可以启动映像的新版本,使用--volumes-from
或-v
挂载数据并终止旧容器。在您的情况下,您必须保持容器运行并尝试使用木偶等方法进行补丁。
另外,我不确定你认为你在节省什么。如果你运行官方的postgres图像,它将在Dockerfile中声明了卷。无论您是否使用-v
运行容器,这些卷都作为主机系统上的普通目录存在。即使您的Dockerfile没有卷,显然UFS仍然存储在您的主机上。
通常,您应该将容器视为临时容器和无状态容器。虽然您不必这样做,但您会发现大多数工具和支持服务都是围绕这个习惯设计的。
关于您的方案,有一些您遗漏:
为了明确命令,docker start
将重新启动已停止或已退出的容器,docker unpause
将取消暂停的容器。