首页 > 解决方案 > 在 docker-compose.yml 卷中声明为部分和在服务下有什么区别?

问题描述

docker-compose.yml在文件中声明卷部分和仅在服务下使用卷关键字有什么区别?

例如,我以这种方式为容器映射卷:

services:
   mysqldb:
      volumes:
         - ./data:/var/lib/mysql

这将映射到我的工作目录中名为 data 的文件夹。

但我也可以通过声明一个卷部分来映射一个卷,并将其别名用于容器:

services:
   mysqldb:
      volumes:
         - data_volume:/var/lib/mysql
volumes:
   data_volume:
      driver: local

在这种方法中,存储映射文件的实际位置似乎在某种程度上由 docker compose 管理。

这两种方法有什么区别还是相同?我应该真正使用哪一个?

使用一种方法比另一种方法有什么好处吗?

标签: dockerdocker-composedocker-volume

解决方案


您描述的方法之间的区别在于,第一种方法是绑定挂载,另一种是。这些是更多的 Docker 功能(而不是 Docker Compose),与从主机的文件系统挂载路径相比,卷提供了几个好处。如文档中所述,它们:

  • 更容易备份或迁移
  • 可以使用docker volumesAPI 进行管理(与原始文件系统相反)
  • 在 Linux 和 Windows 容器上工作
  • 可以在多个容器之间安全共享
  • 可以让容器预先填充内容(使用绑定挂载,有时您必须将数据复制出来,然后重新启动容器)

使用卷的另一个巨大好处是卷驱动程序,您可以指定它来代替local. 它们允许您远程存储卷(即云等)或添加其他功能,如加密。这是容器概念的核心,因为如果正在运行的容器是无状态的并且使用远程卷,那么您可以跨主机移动容器并且它可以在不重新配置的情况下运行。

因此,建议使用 Docker 卷。另一个很好的例子如下:

services:
  webserver_a:
    volumes:
      - ./serving/prod:/var/www
  webserver_b:
    volumes:
      - ./serving/prod:/var/www
  cache_server:
    volumes:
      - ./serving/prod:/cache_root

如果将./serving目录移动到其他位置,绑定挂载会中断,因为它是相对路径。正如您所指出的,卷具有别名,并且它们的路径由 Docker 管理,因此:

  1. 您不需要查找和替换路径 3 次
  2. 使用的卷local将数据存储在系统上的其他位置,并且会继续正常安装

TL;DR:尝试使用卷。它们是可移植的,并鼓励减少对主机依赖的做法。


推荐阅读