繁体   English   中英

在部分中和服务下声明docker-compose.yml卷有什么区别?

[英]What's the difference between declaring in docker-compose.yml volume as section and under a service?

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

例如,我以此方式为容器映射一个卷:

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

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

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

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

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

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

使用一种方法相对于另一种方法有什么好处?

您所描述的方法之间的区别在于,第一个方法是绑定安装 ,另一个是 这些是更多的Docker函数(而不是Docker Compose),并且从挂载主机文件系统的路径中,卷提供了许多好处。 如文档中所述,他们:

  • 更容易备份或迁移
  • 可以使用docker volumes或API(而不是原始文件系统)进行管理
  • 在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:尝试使用卷。 它们是可移植的,并鼓励减少对主机的依赖性的做法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM