docker中的命名卷是如何工作的?

我正在努力了解docker 文档中以下示例中指定卷的工作方式:

version: "3" services: db: image: db volumes: #1 - data-volume:/var/lib/db backup: image: backup-service volumes: #2 - data-volume:/var/lib/backup/data volumes: data-volume: 

我的猜测是,命名卷(#1)的第一次出现定义了卷内所包含的内容,而随后的出现(#2)只是将卷的内容与所引用的任何容器共享

这个猜测是正确的吗?

列出data-volume:在顶级volumes: key在主机上创build一个命名卷(如果它尚不存在)。 根据这个来源,这performance如下

  1. 如果通过从docker run -v my-precious-data:/ data imageName运行映像的新容器来创build命名卷,则/ data下的映像/容器中的数据将被复制到指定的卷中。

  2. 如果您创build另一个容器绑定到现有的已命名卷,则不会复制/覆盖新映像/容器中的文件,而是使用已命名卷中的现有数据。

  3. 他们没有docker命令来备份/导出指定的卷。 但是,您可以通过“docker volume inspect [volume-name]”find文件的实际位置。

如果卷为空,并且两个容器都在目标目录中有数据,则要运行的第一个容器将其数据挂载到卷中,另一个容器将看到该数据(而不是自己的数据)。 我不知道哪个容器会先运行(我希望它会从上到下执行),但是您可以使用depends_on强制执行命令,如此处所示

——————-更新

使用版本3撰写文件在群集模式下部署堆栈时,将忽略depends_on选项。

我明白你的猜测,你不完全正确。

在docker-compose文件中声明并引用一个已命名的卷将创build一个空卷,然后可以通过在卷节中说明的服务来访问和共享这个空卷。

如果要共享一个命名卷,则必须在docker-compose文件的顶级卷部分中声明此卷。 示例(如在您自己已经链接的docker文档中):

 version: "3" services: db: image: db volumes: #1 uses the named and shared volume 'data-volume' created with #3 - data-volume:/var/lib/db backup: image: backup-service volumes: #2 uses the named and shared volume 'data-volume' created with #3 - data-volume:/var/lib/backup/data volumes: #3 creates the named volume 'data-volume' data-volume: 

该卷在开始时将为空(因此该卷所在的容器中的文件夹将为空)。 它的内容将是运行时服务的结果。

希望这个更清楚一点。