docker – 带有命名或匿名卷的`data-container` – 概念问题? (讨论)

提问

a)匿名卷

使用数据容器时,您可以使用这样的匿名卷

version '2'
services:
  consumer:
    volume_from:
      - data-container:rw
  data-container:
    image: cogniteev/echo
    command: echo 'Data Container'
    volume:
      - /var/www

b)名称卷

或者您可以使用这样的命名卷

version '2'
services:
  consumer:
    volume_from:
      - data-container:rw
  data-container:
    image: cogniteev/echo
    command: echo 'Data Container'
    volume:
      - my-named-volume:/var/www

 volumes:
   my-named-volume:
     driver: local

我通常与b)一起讨论/解释可能两者的概念问题/缺陷.那么利弊是什么呢?

我们可以比较它们的方面是/可能是:

>便携性
>数据容器的可升级性(为什么我们要升级容器?)
>开始/停止(继续)兼容性?
>多堆栈问题?
>效率(重用量)

对于这个问题https://stackoverflow.com/a/38984689/3625317的讨论,这个问题已经过去了

最佳答案

简短回答:首选命名数据卷,不再需要数据容器,因此不应在任何新项目中使用volume-from.

您的命名卷版本正在合并命名和数据容器,它应该是:

version '2'
services:
  web:
    image: my-web-image
    volumes:
      - my-named-volume:/var/www

 volumes:
   my-named-volume:
     driver: local

通过合并这两者,您已经添加了一个额外的间接层来到达您指定的卷,而没有任何额外的好处.命名卷是在1.9到replace data containers中创建的,这些卷本身就是一种提供持久数据的有点被黑客攻击的方法.命名卷对数据容器的优点包括:

>您的数据管理与容器管理是分开的,您可以删除所有正在运行的容器,但仍然可以使用您的数据
>可以使用卷驱动程序将数据存储在不同的位置,这意味着您可以将其放在nfs,分布式文件系统甚至本地持久性目录中
>您可以按任何顺序启动和停止任何容器,而不会在容器之间存在依赖关系
>首次创建时,命名卷将接收首先挂载的映像文件系统的副本,与数据容器的行为相同,这意味着它是无缝转换(请注意,这不是主机卷的行为) ,又名绑定安装)

另见this question that also discusses named volumes vs data containersthis answer到另一个类似的问题.我们工作的公司也有blog post on this.