命名卷如何在docker中工作?

Ale*_*mia 6 docker docker-compose

我很难理解命名卷在docker docs的以下示例中的确切作用:

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:
Run Code Online (Sandbox Code Playgroud)

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

这个猜测是否正确?

Eve*_*reG 8

据我了解你的猜测,你并不完全正确。

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

如果要共享命名卷,则必须在 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:
Run Code Online (Sandbox Code Playgroud)

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

希望这让它更清楚一点。


her*_*erm 5

清单data-volume:下的顶级volumes:键在主机上创建一个名为量,如果不存在了.根据此来源,这表现如下

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

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

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

如果卷为空并且两个容器都在目标目录中有数据,则要运行的第一个容器将其数据装入卷中,而另一个容器将看到该数据(而不是它自己的数据).我不知道哪个容器将首先运行(althoug我希望它从上到下执行),但是你可以强制与depends_on顺序如图所示这里

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

在具有版本3 Compose文件的swarm模式下部署堆栈时,将忽略depends_on选项.

  • 文件存储在主机磁盘的什么位置? (10认同)