泊坞窗撰写卷类型-绑定与卷

时间:2019-03-26 21:22:12

标签: docker docker-compose docker-volume

我的简短问题:

docker-compose中,两者之间有什么区别

volumes:
    - type: volume
            source: mydata
            target: /data

volumes:
    - type: bind
            source: mydata
            target: /data

问题很长:

volumes文件中指定docker-compose选项时,可以使用long-syntax style

根据文档,type选项接受3个不同的值: volume bind { {1}}

我了解tmpfs选项-it means that the volume will not be saved after the container is down.

但是我在文档中找不到关于其他两个选项之间的区别的参考文献:tmpfsbind,有人可以启发我吗?

2 个答案:

答案 0 :(得分:2)

当绑定装载是来自主机的文件时,卷更像是docker的

  • 绑定装载是从主机(运行docker守护程序的主机)装载到容器上的文件。
  • 卷就像完全由docker管理的存储空间。
    在文献中,您会发现两种类型的卷:
    • 命名卷(您提供其名称)
    • 匿名卷(来自docker的通常UUID名称,例如您可以在容器或未标记的图像上找到它们)

这些卷带有自己的docker commands集;您也可以通过

查询此列表
docker volume --help

您可以通过以下方式查看现有卷

docker volume ls

您可以通过以下方式创建命名卷

docker volume create my_named_volume

但是您也可以通过docker-compose文件创建卷

version: "3.3"

services:
  mysql:
    image: mysql
    volumes:
      - type: volume
          source: db-data
          target: /var/lib/mysql/data

volumes:
  db-data:

这是说的部分,请泊坞窗,在容器目录/ var / lib / mysql / data 上安装名为 db-data 的卷>

- type: volume
    source: db-data
    target: /var/lib/mysql/data

这是对docker 说的部分,请为我创建一个名为 db-data

的卷。
volumes:
  db-data:

有关三种安装类型的Docker文档:

答案 1 :(得分:2)

如果我对您的理解正确,那么您在问:卷和绑定安装之间有什么区别?

主机上管理和隔离方面的差异

绑定安装存在于主机文件系统上,并由主机维护者管理。
Docker外部的应用程序/进程也可以对其进行修改。

也可以在主机上实现,但是Docker将为我们管理它们,并且无法在Docker之外访问它们。

音量是更广泛的解决方案

尽管这两种解决方案都可以帮助我们将数据生命周期与容器分开, 通过使用 Volumes ,您可以在系统上获得更多的功能和灵活性。

借助 Volumes ,我们可以有效地设计数据,并通过将数据存储在专用远程位置(例如Cloud)并将其与外部服务(例如备份,监视,加密和硬件管理。

与绑定安装相比,更多卷具有以下优势:

  1. 没有主机顾虑。
  2. 可以使用Docker CLI进行管理。
  3. 卷可以为您节省一些与uid / gid问题相关的权限,例如在容器用户的uid与主机gid不匹配的情况下,这些权限会发生。
  4. 新卷的内容可以通过容器预先填充。


示例

让我们采取两种情况。

案例1:Web服务器。
我们想为我们的Web服务器提供一个可能经常更改的配置文件。
例如:根据当前环境公开端口。
我们可以每次使用相关的设置来重建映像,或者为每个环境创建2个不同的映像。这两种解决方案都不是很有效。

使用 Bind挂载 Docker将给定的源目录挂载到容器内的某个位置。
(联合文件系统内部只读层中的原始目录/文件将被覆盖)。

例如-将动态端口绑定到nginx:

version: "3.7"
services:
  web:
    image: nginx:alpine
    volumes:
     - type: bind #<-----Notice the type
       source: ./mysite.template
       target: /etc/nginx/conf.d/mysite.template
    ports:
     - "9090:8080"
    environment:
     - PORT=8080
    command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > 
        /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

(*)请注意,也可以使用Volumes解决此示例。

案例2:数据库。
Docker容器不存储持久性数据:一旦容器停止运行,所有将写入容器的联合文件系统中可写层的数据都将丢失。

但是,如果我们有一个在容器上运行的数据库并且容器停止运行,那意味着所有数据都将丢失?

音量进行救援。
这些被命名为文件系统树,由Docker为我们管理。

例如-持久化Postgres SQL数据:

services:    
  db:
    image: postgres:latest
    volumes:
      - "dbdata:/var/lib/postgresql/data"
    volumes:
     - type: volume #<-----Notice the type
       source: dbdata
       target: /var/lib/postgresql/data
volumes:
  dbdata:

请注意,在这种情况下,对于命名卷,源是卷的名称 (对于匿名卷,将省略此字段)。