本文是《Docker必知必会系列》第五篇,原文发布于个人博客:悟尘纪。
数据持久化存储与性能调优
数据持久保存
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着当该容器不再存在时,数据也将丢失。
为了让数据脱离容器持久保存,Docker 提供了两个选项来将文件持久存储在主机中: volume
和 bind mount
。如果您在 Linux 上运行 Docker,则还可以使用 tmpfs 挂载。如果您在 Windows 上运行 Docker,则还可以使用命名管道。
-
volume(卷)存储在主机文件系统的一部分中,该文件系统由 Docker 管理(
/var/lib/docker/volumes/
在 Linux 上)。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久保存数据的最佳方法。 - bind mount(绑定挂载)可以存储在主机系统上的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时对其进行修改。
-
tmpfs
挂载 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统中。
volume
和 bind mount
都可以使用 -v
或 --volume
标志安装到容器中,但是两者的语法略有不同。
关于挂载类型的更多详细信息:Manage data in Docker
挂载卷性能调优
在 macOS(和其他非 Linux 平台)上,保证容器内和主机文件一致性的开销很大。然而,在许多情况下,容器与主机之间不需要完美的一致性。区分不同情况可以显着提高性能。
通过在 docker run -v
, --volume
的 option 中指定 cached
或 delegated
,可以显着提高 Docker Desktop for Mac 上已装载卷访问的性能。您可以根据情况调整所需的一致性级别:
-
consistent
:默认值,完美的一致性,即主机和容器实时一致。 -
cached
:主机具有权威性。容器执行的写操作对主机是立即可见的,但是在主机上执行的写操作可能不会立即反应在容器内。 -
delegated
:容器的内容具有权威性。提供最弱保证,由容器执行的写操作可能不会立即反映在主机文件系统上,提供的性能要比其他配置好得多。
为每个挂载卷独立设置缓存策略,例如:
docker run \
-v /Users/lixl.cn/project:/project:cached \
-v /host/another-path:/mount/another-point:consistent \
alpine command