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

Car*_*ven 1 docker docker-compose docker-volume

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

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

services:
   mysqldb:
      volumes:
         - ./data:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

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

但我也可以通过声明一个卷部分来映射一个卷,并为容器使用它的别名:

services:
   mysqldb:
      volumes:
         - data_volume:/var/lib/mysql
volumes:
   data_volume:
      driver: local
Run Code Online (Sandbox Code Playgroud)

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

这两种方法有什么区别或者它们是一样的吗?我应该真正使用哪一种?

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

hex*_*ide 7

您所描述的方法之间的区别在于,第一种方法是bind mount,另一种是volume。这些是更多的 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
Run Code Online (Sandbox Code Playgroud)

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

  1. 您不需要查找和替换路径 3 次
  2. 使用local存储数据的卷在系统上的其他地方,并会继续安装就好了

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