在 docker-compose.yml 卷中声明为部分和在服务下有什么区别?
What's the difference between declaring in docker-compose.yml volume as section and under a service?
在 docker-compose.yml
文件中声明 volume 部分与仅在服务下使用 volumes 关键字有什么区别?
例如,我以这种方式为容器映射卷:
services:
mysqldb:
volumes:
- ./data:/var/lib/mysql
这将映射到我的工作目录中名为 data 的文件夹。
但我也可以通过声明一个卷部分来映射一个卷,并将其别名用于容器:
services:
mysqldb:
volumes:
- data_volume:/var/lib/mysql
volumes:
data_volume:
driver: local
在此方法中,存储映射文件的实际位置似乎在某种程度上由 docker compose 管理。
这两种方法有什么不同或相同?我应该真正使用哪一个?
使用一种方法比使用另一种方法有什么好处吗?
您描述的方法之间的区别在于第一种方法是 bind mount, and the other is a volume。这些是更多的 Docker 功能(而不是 Docker Compose),并且与从主机文件系统安装路径相比,卷提供了几个好处。如文档中所述,他们:
- 更容易备份或迁移
- 可以使用
docker volumes
或 API(相对于原始文件系统) 进行管理
- 在 Linux 和 Windows 容器上工作
- 可以在多个容器之间安全共享
- 可以让容器预先填充内容(使用绑定装载有时您必须复制数据,然后重新启动容器)
使用卷的另一个巨大好处是 卷驱动程序,您可以指定它来代替 local
。它们允许您远程存储卷(即云等)或添加其他功能,如加密。这是容器概念的核心,因为如果 运行ning 容器是无状态的并且使用远程卷,那么您可以跨主机移动容器并且它可以是 运行 而无需重新配置。
因此,建议使用 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 管理,因此:
- 您不需要查找和替换路径 3 次
- 使用
local
的卷将数据存储在您系统的其他地方,并且可以继续安装
TL;DR:尝试使用卷。它们是可移植的,并鼓励减少对主机的依赖性的做法。
在 docker-compose.yml
文件中声明 volume 部分与仅在服务下使用 volumes 关键字有什么区别?
例如,我以这种方式为容器映射卷:
services:
mysqldb:
volumes:
- ./data:/var/lib/mysql
这将映射到我的工作目录中名为 data 的文件夹。
但我也可以通过声明一个卷部分来映射一个卷,并将其别名用于容器:
services:
mysqldb:
volumes:
- data_volume:/var/lib/mysql
volumes:
data_volume:
driver: local
在此方法中,存储映射文件的实际位置似乎在某种程度上由 docker compose 管理。
这两种方法有什么不同或相同?我应该真正使用哪一个?
使用一种方法比使用另一种方法有什么好处吗?
您描述的方法之间的区别在于第一种方法是 bind mount, and the other is a volume。这些是更多的 Docker 功能(而不是 Docker Compose),并且与从主机文件系统安装路径相比,卷提供了几个好处。如文档中所述,他们:
- 更容易备份或迁移
- 可以使用
docker volumes
或 API(相对于原始文件系统) 进行管理
- 在 Linux 和 Windows 容器上工作
- 可以在多个容器之间安全共享
- 可以让容器预先填充内容(使用绑定装载有时您必须复制数据,然后重新启动容器)
使用卷的另一个巨大好处是 卷驱动程序,您可以指定它来代替 local
。它们允许您远程存储卷(即云等)或添加其他功能,如加密。这是容器概念的核心,因为如果 运行ning 容器是无状态的并且使用远程卷,那么您可以跨主机移动容器并且它可以是 运行 而无需重新配置。
因此,建议使用 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 管理,因此:
- 您不需要查找和替换路径 3 次
- 使用
local
的卷将数据存储在您系统的其他地方,并且可以继续安装
TL;DR:尝试使用卷。它们是可移植的,并鼓励减少对主机的依赖性的做法。