默认情况下,在容器内创建的所有文件都存储在可写容器层中。 这意味着:

  • 容器删除时数据丢失,并且其他进程很从容器中读取数据
  • 容器的可写层紧密耦合到运行容器的主机。 您无法轻松地将数据移动到其他位置。
  • 写入容器的可写层需要存储驱动程序来管理文件系统。 存储驱动程序使用Linux内核提供联合文件系统。 与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能

Docker有两个容器选项可以在主机中存储文件,因此即使在容器停止之后文件仍然存在:卷和绑定挂载。 如果你在Linux上运行Docker,你也可以使用tmpfs mount。

选择正确的挂载方式

无论你选择那种挂载方式,在容器看来都一样。

一个简单的区分volumes(卷),bind mounts(绑定挂载), tmpfs 挂载的方法是,通过查看数据实际所在的位置。
管理Docker中的数据

  • 存储在由Docker管理的主机文件系统的一部分中(Linux上的/ var / lib / docker / volumes /)。
  • 绑定挂载可以存储在主机系统的任何位置。 它们甚至可能是重要的系统文件或目录。 Docker主机或Docker容器上的非Docker进程可以随时修改它们。
  • tmpfs挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。

有关挂载方式的更多细节

Volumes:

由Docker创建和管理。 您可以使用docker volume create命令显式创建卷,或者Docker可以在容器或服务创建期间创建卷。

创建卷时,它存储在Docker主机上的目录中。 将卷装入容器时,此目录是装入容器的目录。 这类似于绑定挂载的工作方式,除了卷由Docker管理并与主机的核心功能隔离。

给定的卷可以同时安装到多个容器中。 当没有正在运行的容器正在使用卷时,该卷仍可供Docker使用,并且不会自动删除。 您可以使用docker volume prune删除未使用的卷。

当你挂载卷时,可以选择命名或者匿名。 匿名卷在首次装入容器时未给出明确的名称,因此Docker为它们提供了一个随机名称,该名称在给定的Docker主机中保证是唯一的。 除名称外,命名和匿名卷的行为方式相同。

卷还支持使用卷驱动程序,这些驱动程序允许您将数据存储在远程主机或云提供程序上,以及其他可能性。

Bind mounts:

Bind mounts在Docker早期就存在。和相比,绑定挂载的功能很有限。你可以使用绑定挂载将主机上的文件和目录挂载到容器。需要指明文件或目录在主机上的完整路径。文件和目录如果不存在主机上不需要手动建立,会被自动建立。绑定挂载非常高效,但是它需要主机上面有特定的目录结构。如果你在开发新的应用,最好使用命名卷,因为你没有办法利用Docker CLI 来管理绑定挂载

tmpfs mounts:

tmpfs挂载无论在Docker主机还是容器都不会将数据存储到硬盘。它可以在容器的生命周期中由容器使用,以存储非持久状态或敏感信息。 例如,在内部,swarm服务使用tmpfs挂载将秘密挂载到服务的容器中。

绑定挂载都通过-v和–volume标志,但是语法稍有区别。tmpfs 绑定由–tmpfs标志。但是在Docker 17.06或者更高版本,我们推荐使用–mount标志所有类型的挂载方式。

卷的良好用例

卷是在Docker容器和服务中持久保存数据的首选方法。 卷的一些用例包括:

  • 在多个运行容器之间共享数据。 如果未显式创建它,则会在第一次将其装入容器时创建卷。 当该容器停止或被移除时,该卷仍然存在。 多个容器可以同时安装相同的卷,可以是读写也可以是只读。 仅在您明确删除卷时才会删除卷。
  • 当Docker主机不能保证具有给定的目录或文件结构时。 卷可帮助您将Docker主机的配置与容器运行时分离。
  • 如果要将容器的数据存储在远程主机或云提供程序上,而不是本地存储。
  • 当您需要将数据从一个Docker主机备份,还原或迁移到另一个Docker主机时,卷是更好的选择。 您可以使用卷停止容器,然后备份卷的目录(例如/ var / lib / docker / volumes / )。

绑定挂载的良好用例

通常,您应尽可能使用卷。 绑定适用于以下类型的用例:

  • 将配置文件从主机共享到容器。 这就是Docker默认情况下通过将/etc/resolv.conf从主机安装到每个容器中来为容器提供DNS解析的方法。
  • 在Docker主机上的开发环境和容器之间共享源代码或构建工件。 例如,您可以将Maven目标/目录安装到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问重建的工件。
    如果以这种方式使用Docker进行开发,您的生产Dockerfile会将生产就绪的部件直接复制到映像中,而不是依赖于绑定装载。
  • 当Docker主机的文件或目录结构保证与容器所需的绑定安装一致时。

tmpfs挂载的良好用例

tmpfs挂载最适用于您不希望数据在主机或容器内持久存在的情况。 这可能是出于安全原因,或者在应用程序需要编写大量非持久状态数据时保护容器的性能。

使用绑定挂载或卷的小贴士

如果您使用绑定装入或卷,请记住以下几点:

  • 如果将空卷装入容器中存在文件或目录的目录中,则会将这些文件或目录传播(复制)到卷中。 同样,如果启动容器并指定尚不存在的卷,则会为您创建一个空卷。 这是预先填充另一个容器所需数据的好方法。
  • 如果将绑定挂载非空卷装入容器中存在某些文件或目录的目录中,会遮盖这些文件或目录,就像在Linux主机上将文件保存到/ mnt中一样 将USB驱动器安装到/ mnt中。 在卸载USB驱动器之前,/ mnt的内容将被USB驱动器的内容遮挡。 隐藏的文件不会被删除或更改,但在安装绑定挂载时无法访问。

相关文章:

  • 2021-11-29
  • 2021-04-14
  • 2021-11-13
  • 2021-08-21
猜你喜欢
  • 2021-12-19
  • 2021-06-06
  • 2022-12-23
  • 2022-12-23
  • 2021-04-24
  • 2021-07-19
  • 2021-08-21
相关资源
相似解决方案