命名卷在docker中如何工作?

命名卷在docker中如何工作?,docker,docker-compose,Docker,Docker Compose,在docker的以下示例中,我很难理解命名卷是如何工作的: 版本:“3” 服务: db: 图像:db 卷数: #1 -数据量:/var/lib/db 备份: 图像:备份服务 卷数: #2 -数据量:/var/lib/backup/data 卷数: 数据量: 我的猜测是,命名卷的第一次出现(#1)定义了卷中包含的内容,而后续出现(#2)只是与引用它们的任何容器共享卷的内容 这个猜测正确吗?就我理解你的猜测而言,你并不完全正确 在docker compose文件中声明和引用命名卷将创建一个空卷,然

在docker的以下示例中,我很难理解命名卷是如何工作的:

版本:“3”
服务:
db:
图像:db
卷数:
#1
-数据量:/var/lib/db
备份:
图像:备份服务
卷数:
#2
-数据量:/var/lib/backup/data
卷数:
数据量:
我的猜测是,命名卷的第一次出现(#1)定义了卷中包含的内容,而后续出现(#2)只是与引用它们的任何容器共享卷的内容


这个猜测正确吗?

就我理解你的猜测而言,你并不完全正确

在docker compose文件中声明和引用命名卷将创建一个空卷,然后服务可以在其卷部分中这样说来访问和共享该空卷

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

该卷在启动时将为空(因此该卷装载到的容器中的文件夹也将为空)。它的内容将是运行时服务acions的结果


希望这能让它更清楚一点。

列出了顶级
卷下的
数据卷:
键在主机上创建一个命名卷(如果它还不存在)。根据这一点,其行为方式如下

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

  • 如果创建另一个容器绑定到现有命名卷,则不会复制/覆盖新映像/容器中的任何文件,它将使用命名卷中的现有数据

  • 它们没有用于备份/导出命名卷的docker命令。但是,您可以通过“docker volume inspect[卷名]”找到文件的实际位置

  • 如果卷为空且两个容器在目标目录中都有数据,则要运行的第一个容器将其数据装载到卷中,而另一个容器将看到该数据(而不是它自己的数据)。我不知道哪个容器将首先运行(尽管我希望它从上到下执行),但是您可以使用dependens_强制执行订单,如图所示

    -------------------更新

    在swarm模式下使用版本3 Compose文件部署堆栈时,将忽略Dependes_on选项


    谢谢你的回答。据我所知,尽管您的第一个示例中的命名卷正在创建中,但它们基本上是无用的(因为只有一个特定容器可以访问它)?而在第二个示例中,
    数据卷
    实际上用于链接容器之间的这两个目录。我说的对吗?是的,通过第二个示例,您希望实现容器与卷的链接。这在很大程度上取决于我对文档的理解。我已经更新了我的答案,删除了“即时创建”部分。这似乎不适用于docker compose,尽管它适用于docker cli。示例:
    docker run-ti-v data volume:/var/lib/data alpine/bin/sh
    实际上创建了该卷,并使其他容器也可以访问该卷。虽然链接源现在是404,但也解释了,以防需要某个权威源。
    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: