默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
当该容器不再存在时,数据将不会持久保存,并且如果另一个进程需要它,则可能很难从容器中取出数据。
容器的可写层与运行容器的主机紧密耦合。您不能轻易地将数据移动到其他地方。
写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。
Docker为容器提供了两个选项来将文件存储在主机中,以便即使容器停止后文件也可以持久存储:卷和 绑定安装。如果您在Linux上运行Docker,则还可以使用tmpfs挂载。如果您在Windows上运行Docker,则还可以使用命名管道。
选择正确的类型的卷
无论您选择使用哪种类型的安装,容器中的数据看起来都是相同的。它在容器的文件系统中显示为目录或单个文件。
可视化卷,绑定挂载和tmpfs 挂载之间差异的一种简单方法是考虑数据在Docker主机上的位置。
卷存储在主机文件系统的一部分中,该文件系统由Docker管理(/var/lib/docker/volumes/在Linux上)。非Docker进程不应修改文件系统的这一部分。卷是在Docker中持久存储数据的最佳方法。
绑定挂载可以存储在主机系统上的任何位置。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
tmpfs挂载仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统中。
有关安装类型的更多详细信息
卷:由Docker创建和管理。您可以使用docker volume create命令显式创建卷,或者Docker可以在容器或服务创建期间创建卷。
创建卷时,它存储在Docker主机上的目录中。将卷装入容器时,此目录就是装入容器的目录。这类似于绑定挂载的工作方式,除了卷由Docker管理并且与主机的核心功能隔离。
给定的体积可以同时安装到多个容器中。当没有正在运行的容器使用卷时,该卷仍可用于Docker,并且不会自动删除。您可以使用删除未使用的卷docker volume prune。
挂载卷时,它可以命名为或匿名。匿名卷首次安装到容器中时,不会为其指定明确的名称,因此Docker为它们提供一个随机名称,该名称在给定的Docker主机中保证是唯一的。除了名称之外,命名卷和匿名卷的行为也相同。
卷还支持使用卷驱动程序,该驱动程序使您可以将数据存储在远程主机或云提供商上,以及其他可能性。
绑定挂载:自Docker早期以来可用。与卷相比,绑定安装的功能有限。使用绑定安装时,主机上的文件或目录将安装到容器中。文件或目录由主机上的完整路径引用。该文件或目录不需要在Docker主机上已经存在。如果尚不存在,则按需创建。绑定挂载性能很高,但是它们依赖于主机的文件系统,该文件系统具有可用的特定目录结构。如果要开发新的Docker应用程序,请考虑使用命名卷。您不能使用Docker CLI命令直接管理绑定安装。
tmpfs mounts:tmpfs挂载不会持久化在磁盘上,无论是在Docker主机上还是在容器内。容器在其生存期内可以使用它来存储非持久状态或敏感信息。例如,在内部,群集服务使用tmpfs安装将机密安装到服务的容器中。
命名管道:npipe 挂载可用于Docker主机与容器之间的通信。常见用例是在容器内运行第三方工具,并使用命名管道连接到Docker Engine API。
绑定安装和卷都可以使用-v或 --volume标志安装到容器中,但是两者的语法略有不同。对于tmpfs 安装,您可以使用该--tmpfs标志。我们建议--mount对容器和服务,绑定安装,卷或tmpfs安装使用该标志,因为语法更清晰。