【问题标题】:Docker: Creating a data volume container vs simply using the -v flag with `run`?Docker:创建数据卷容器与简单地使用带有`run`的-v标志?
【发布时间】:2016-09-07 00:25:45
【问题描述】:

我正在阅读 Docker 关于卷的用户指南部分:https://docs.docker.com/engine/userguide/containers/dockervolumes/

在第一部分,它说明了如何创建卷并将其添加到容器中,我将其称为“方法 1”:

您可以多次使用 -v 来挂载多个数据卷。现在,在您的 Web 应用程序容器中挂载一个卷。

$ docker run -d -P --name web -v /webapp training/webapp python app.py

这将在 /webapp 的容器内创建一个新卷。

后面再说数据卷容器,我称之为“方法2”:

如果您想要在容器之间共享一些持久性数据,或者想从非持久性容器中使用,最好创建一个命名的数据卷容器,然后从其中挂载数据。

$ docker create -v /dbdata --name dbstore training/postgres /bin/true

这就是我不明白的,通过简单地使用 -v 命令和 docker run(方法 1)实现卷有什么区别?使用“数据卷容器”实现卷(方法二)?

您似乎只是在创建一个在图像的非持久性容器的生命周期中持久的卷,如果我错了,请纠正我。

【问题讨论】:

  • 我的理解是create创建了一个容器但不运行它,所以你得到一个不消耗任何CPU的纯数据容器。然后,您可以与许多其他容器共享此容器中的卷。
  • @warmoverflow 实际上你可以create 一个卷而不将它放入容器中,当我发布问题时我很困惑所以不是很清楚,但不同的是在方法 1 中你不需要'不要将卷放入容器中,在方法 2 中将其放入容器中,使其成为“数据容器”或其他东西。
  • 如文档所述,在方法 1 中,卷位于容器内。是的,你可以创建一个没有容器的卷,但你需要使用docker volume create,而不是docker create -v
  • 哦,对不起,没错,问题应该是使用docker create -v /dbdata --name dbstore training/postgres /bin/true与使用docker volume create --name hello有什么区别,注意两者都是用create完成的,但第一个是作为容器创建的(文档称其为“数据卷容器”),两者都旨在作为一个卷工作,当您使用 run 对其进行初始化时,您可以将其与容器绑定。我还不如重新提交这个问题,docker文档只是有点混乱。
  • 这只是Docker的演进。过去需要创建一个容器才能使用数据卷容器模式。我相信docker volume create 是为了简化这一点最近添加的。

标签: docker volumes


【解决方案1】:

在我的理解中,至少从 docker 1.12 开始,卷总是相同的东西:一些持久性数据存储在主机的某处。但是管理卷有不同的方法:

  1. 创建它并将其安装到容器(您的方法 1)。有了这个,当你想将一个容器的卷挂载到另一个容器中时,你可以使用“volumes-from”
  2. 使用docker volume create创建卷,并让docker管理它。它将保存在主机系统的某个位置(例如 /var/lib/docker),但您并不真正关心确切的位置和方式。
  3. 将主机目录挂载为卷,在这种情况下,您知道它在主机上的挂载位置,并且您对此负有“责任”。

然后,有“技巧”(如here所述。例如:

"如果您通过 docker run -v my-precious-data:/data imageName 从镜像运行新容器来创建命名卷,则 /data 下的容器内的数据将被复制到命名卷中。”

因此,您创建/管理卷的方式可能会有所不同,但它本质上始终是一个卷。

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多