Docker ——Use volumes
在Docker中管理数据
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
- 当该容器不再存在时,数据将不会持久保存,并且如果另一个进程需要它,则可能很难从容器中取出数据。
- 容器的可写层与运行容器的主机紧密耦合。您不能轻易地将数据移动到其他地方。
- 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。
Docker为容器提供了两个选项来将文件存储在主机中,以便即使容器停止后文件也可以持久存储:volumes, and bind mounts。如果您在Linux上运行Docker,则还可以使用tmpfs挂载。如果您在Windows上运行Docker,则还可以使用named pipe。
选择合适的安装座类型
无论您选择使用哪种类型的安装,容器中的数据看起来都是相同的。它在容器的文件系统中显示为目录或单个文件。
可视化volumes,bind mounts和tmpfs
挂载之间差异的一种简单方法是考虑数据在Docker主机上的位置。
-
volumes存储在主机文件系统的一部分中,该文件系统由Docker管理(
/var/lib/docker/volumes/
在Linux上)。非Docker进程不应修改文件系统的这一部分。volumes是在Docker中持久保存数据的最佳方法。 -
bind mounts可以存储在主机系统上的任何位置。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
-
tmpfs
挂载仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统中。
volumes是用于持久化由Docker容器生成和使用的数据的首选机制。尽管bind mounts取决于主机的目录结构,但是卷完全由Docker管理。与绑定安装相比,卷具有几个优点:
- 与“bind mounts”安装相比,volumes更易于备份或迁移。
- 您可以使用Docker CLI命令或Docker API管理“volumes”。
- 卷在Linux和Windows容器上均可工作。
- 可以在多个容器之间更安全地共享卷。
- Volume 驱动程序使您可以将卷存储在远程主机或云提供商上,以加密卷内容或添加其他功能。
- New volumes的内容可以由容器预先填充。
如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。
bind mounts和volumes都可以使用-v
或 --volume
标志安装到容器中,但是两者的语法略有不同。对于tmpfs
安装,您可以使用该--tmpfs
标志。但是,在Docker 17.06及更高版本中,建议将--mount
标志用于容器和服务,用于bind mounts,volumes或tmpfs
安装,因为语法更清晰。
选择-v或--mount标志
最初,-v
or --volume
标志用于独立容器,而--mount
标志用于集群服务。但是,从Docker 17.06开始,您还可以使用--mount
独立容器。总的来说, --mount
是更明确和冗长的。最大的区别是该-v
语法将所有选项合并在一个字段中,而--mount
语法将它们分开。