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

Efr*_*tan 7 docker docker-compose docker-volume

TLDR

在中docker-compose,有什么区别

volumes:
    - type: volume
      source: mydata
      target: /data
Run Code Online (Sandbox Code Playgroud)

volumes:
    - type: bind
      source: mydata
      target: /data
Run Code Online (Sandbox Code Playgroud)

问题很长:

volumesdocker-compose文件中指定选项时,可以使用长语法样式

根据该文档,所述type选项接受3个不同的值:volumebindtmpfs

我了解该tmpfs选项- 这意味着在关闭容器后将不会保存该卷。

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

β.ε*_*.βε 23

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

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

这些卷带有自己的一组docker 命令;您也可以通过以下方式查阅此列表

docker volume --help
Run Code Online (Sandbox Code Playgroud)

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

docker volume ls
Run Code Online (Sandbox Code Playgroud)

您可以通过创建命名卷

docker volume create my_named_volume
Run Code Online (Sandbox Code Playgroud)

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

version: "3.3"

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

volumes:
  db-data:
Run Code Online (Sandbox Code Playgroud)

这是说请 docker的部分,将名为db-data的卷挂载到容器目录 /var/lib/mysql/data 的顶部

- type: volume
    source: db-data
    target: /var/lib/mysql/data
Run Code Online (Sandbox Code Playgroud)

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

volumes:
  db-data:
Run Code Online (Sandbox Code Playgroud)

关于三种挂载类型的 Docker 文档:


Rtm*_*tmY 19

如果我理解正确,您就是在问: Volumes 和 bind mounts 有什么区别?

主机上管理和隔离的差异

绑定挂载 存在于主机文件系统上并由主机维护者管理。
Docker 之外的应用程序/进程也可以修改它。

Volumes也可以在宿主机上实现,但是 Docker 会为我们管理它们,并且它们不能在 Docker 之外访问。

卷是一个更广泛的解决方案

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

使用Volumes,我们可以有效地设计我们的数据,并通过将数据存储在专用的远程位置(例如云)并将其与备份、监控、加密和硬件管理等外部服务集成,从而将其与主机和系统的其他部分分离。

与绑定安装相比,更多的 Volumes 优势:

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

例子

让我们来看看 2 个场景。

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

使用Bind mounts 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;'"
Run Code Online (Sandbox Code Playgroud)

(*) 请注意,此示例也可以使用 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:
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这个答案比接受的答案解释得更好,谢谢 (3认同)
  • “一旦容器停止运行,任何写入容器联合文件系统可写层的数据都将丢失。” --&gt; 容器被删除后。没有停止。来源:https://docs.docker.com/storage/storagedriver/ 非常明确的答案。 (2认同)

VKa*_*atz 7

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
FeatureBindVolume\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2 \xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0 \xc2\xa0
内在灵魂绑定挂载将主机文件系统上用户指定的位置附加到容器文件树中的特定点。卷附加到主机文件系统或云存储上的磁盘存储。
命令--mount type=bind,src="",dst=""Docker CLI
docker volume命令
依赖性取决于主机文件系统的位置。独立于容器的数据管理
关注点分离是的
与其他容器冲突示例: Cassandra 的多个实例均使用同一主机位置作为数据存储的绑定安装。在这种情况下,每个实例都会竞争同一组文件。如果没有文件锁等其他工具,这可能会导致数据库损坏。不会。默认情况下,Docker 使用local卷插件创建卷。
何时选择1-当主机提供容器中运行的程序所需的文件或目录,或者容器化程序生成由在容器外部运行的用户或程序处理的文件或日志时,绑定挂载非常有用。
2-适用于工作站、具有专门关注点的机器的工具
3-具有更传统配置管理工具的系统。
使用持久存储
1.数据库
2.云存储
什么时候不该选择最好避免在通用平台或硬件池中进行此类特定绑定。待写
\n