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