在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管理的。
这两种方法之间有什么区别或相同?我应该真正使用哪一个?
使用一种方法比另一种方法有什么好处吗?
答案 0 :(得分:2)
您所描述的方法之间的区别在于,第一个方法是bind mount,另一个是volume。这些是更多的Docker函数(而不是Docker Compose),并且从挂载主机文件系统的路径中,卷提供了许多好处。如文档中所述,它们:
docker volumes
或API(而不是原始文件系统)进行管理使用卷的另一个巨大好处是卷驱动程序,您可以在<{1}}处指定它。它们使您可以远程存储卷(即云等)或添加其他功能(如加密)。这是容器概念的核心,因为如果正在运行的容器是无状态的并且使用远程卷,那么您可以在主机之间移动容器,并且可以在不重新配置的情况下运行容器。
因此,建议使用Docker卷。另一个很好的例子如下:
local
如果将services:
webserver_a:
volumes:
- ./serving/prod:/var/www
webserver_b:
volumes:
- ./serving/prod:/var/www
cache_server:
volumes:
- ./serving/prod:/cache_root
目录移动到其他位置,则绑定装入会中断,因为它是相对路径。如您所述,卷具有别名,并且其路径由Docker管理,因此:
./serving
的卷将数据存储在系统上的其他位置,并且可以继续安装TL; DR:尝试使用卷。它们是可移植的,并鼓励减少主机依赖的做法。