我正在查看容器中的数据管理。在Docker中有两种管理数据的方法。
https://docs.docker.com/userguide/dockervolumes/
我的问题是:这两种方法的优缺点是什么?
发布于 2015-01-15 03:27:12
基本上可以有三种方法来管理容器中的数据,也许最好的方法是概述并提供一些逐例的例子,说明何时和为什么使用这些方法。
首先,您可以选择使用联合文件系统。每个运行的容器都有一个由UFS提供的相关的可写层,因此如果我基于我的选择映像运行一个容器,那么我在该会话期间执行的写操作(当容器运行时)可以提交回映像并持久化,方法是它们与图像的构建永久关联。因此,如果您有一个Debian映像并执行apt-get update && apt-get install -y python
,您就有可能将其提交回该映像,与其他人共享它,并为每个人节省执行所有这些多个网络请求所需的时间,以便拥有一个带有Python预安装的最新容器。
其次,您可以使用卷。当容器运行时,将写入以卷为目标的目录,以保持UFS的独特性,并保持与容器的关联。只要关联容器存在,卷也存在。假设您有一个容器,它的入口点是一个在/var/logs/myapp
上生成日志的进程。如果没有卷,进程编写的数据可能会在不经意间被提交回映像,不必要地增加图像的大小。相反,只要容器存在,如果进程崩溃并关闭容器,您就可以访问日志并检查所发生的事情。从本质上说,存储在与此类容器相关的卷中的数据是短暂的--丢弃容器,进程生成的数据就消失了。如果容器的映像被更新,并且您处理了一个新的映像,或者您不再需要生成的日志,那么您可以简单地删除和重新创建容器,并有效地从磁盘中刷新生成的日志。
虽然这看起来很棒,但是用数据库编写的数据会发生什么呢?当然,它不是作为UFS的一部分而保留的,但是如果您更新DB映像或从foo/postgresql
切换到bar/postgresql
,并且在每种情况下都有一个新的容器,您就不能简单地让它刷新。显然,这是不可接受的,这也是第三种选择,即拥有一个具有关联卷的持久性命名容器,并充分利用卷功能的范围,例如能够与其他容器共享它们,即使关联容器没有实际运行。使用此模式,您可以拥有一个dbdata
容器,并将/var/lib/postgresql/data
配置为卷。然后,您可以可靠地拥有临时数据库容器,并在不丢失重要数据的情况下轻松地删除和重新创建它们。
因此,简要介绍一下有关卷的一些事实:
然后,作为一般的经验法则:
发布于 2015-01-15 09:20:10
我不认为它们是不同的方法。
卷是绕过Union文件系统的机制,从而允许与其他容器和主机轻松地共享数据。数据-容器只需包装一个卷(或多个卷),以提供一个方便的名称,您可以在--volumes-from
语句中使用它在容器之间共享数据。没有数据卷就不能有数据容器。
发布于 2015-01-14 23:38:33
数据容器提供:
数据卷映射提供:
总之,我认为这实际上取决于您希望对底层存储施加多大的控制。就我个人而言,我喜欢Docker提供的抽象和间接,因为我喜欢端口映射。
https://stackoverflow.com/questions/27953760
复制相似问题