docker数据量的优缺点是什么?

时间:2015-01-14 22:38:50

标签: docker

我正在研究容器中的管理数据。有两种方法可以在Docker中管理数据。

  • 数据卷和
  • 数据量容器

https://docs.docker.com/userguide/dockervolumes/

我的问题是:这两种方法的优点和缺点是什么?

3 个答案:

答案 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配置为卷。然后,您可以可靠地拥有临时数据库容器,并在不丢失重要数据的情况下轻松地删除和重新创建它们。

所以,回顾一下卷的一些事实:

  • 卷与容器相关联
  • 写入卷目录直接写入卷本身,绕过UFS
  • 这使得可以跨多个容器独立共享卷
  • 删除最后一个关联容器时销毁卷
  • 如果您不希望在删除临时容器时丢失存储在卷中的重要数据,请将该卷与永久命名容器关联,并与非持久容器共享以保留数据

然后,作为一般经验法则:

  • 您希望成为每个容器环境的永久功能的数据应写入UFS并提交给映像
  • 应将容器管理进程生成的数据写入卷
  • 如果删除容器,写入您不想意外丢失的卷的数据应该与您打算保留的命名容器相关联,然后与之后可以安全删除的其他瞬态容器共享

答案 1 :(得分:2)

我不认为它们是不同的方法。

卷是绕过Union文件系统的机制,从而允许轻松地与其他容器和主机共享数据。数据容器只是包装一个卷(或多个卷)以提供一个方便的名称,您可以在--volumes-from语句中使用它来在容器之间共享数据。没有数据量,您就无法拥有数据容器。

答案 2 :(得分:1)

数据容器提供:

  1. 为您的存储提供合理的抽象层。 Docker会为您存储和管理构成卷的文件。
  2. 数据容器非常便于使用特殊的" - 卷 - 来自"指示。
  3. 删除数据容器会自动清理数据。
  4. 项目与Flocker类似,演示了最终如何在Docker主机之间共享与容器关联的存储。
  5. 可以使用" docker cp"命令将文件从容器中拉出到主机上。
  6. 数据卷映射提供:

    1. 更易于理解
    2. 明确和直接控制数据的存储位置。
    3. 我遇到过文件所有权和权限问题。例如,在容器中以root身份运行的Docker进程会在文件系统上创建root拥有的文件。 (是的,我理解数据卷以相同的方式存储他们的数据,但使用" docker cp"命令拉出我拥有的文件: - ))
    4. 总之,我认为这实际上归结为您希望对底层存储施加多少控制权。我个人喜欢Docker提供的抽象和间接,因为我喜欢端口映射。