存储概述(引擎) | Storage overview (Engine)
可以将数据存储在容器的可写层中,但有一些缺点:
- 当容器不再运行时,数据将不会持续存在,并且如果其他进程需要数据,则很难从容器中获取数据。
- 容器的可写层紧密耦合到容器运行的主机。您无法轻松地将数据移到其他地方。
- 写入容器的可写层需要存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用数据体积直接写入主机文件系统。
Docker提供了三种不同的方式将数据从Docker主机装载到容器中:卷,绑定挂载或tmpfs
卷。如有疑问,卷几乎总是正确的选择。请继续阅读以获取更多关于将数据安装到容器中的机制的信息。
选择正确的安装类型
无论您选择使用哪种类型的挂载,容器中的数据看起来都是一样的。它被公开为容器文件系统中的目录或单个文件。
一个简单的方法来显示卷之间的差异,绑定挂载和tmpfs
挂载是考虑数据在Docker主机上的位置。
- Volumes存储在由Docker管理的主机文件系统的一部分中(
/var/lib/docker/volumes/
在Linux上)。非Docker进程不应该修改这部分文件系统。卷是在Docker中保留数据的最佳方式。
- 绑定安装可以存储在主机系统的任何位置。他们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
tmpfs
装载仅存储在主机系统的内存中,而不会写入主机系统的文件系统。有关装载类型的更多详细信息
- Volumes:由Docker创建和管理。您可以使用该
docker volume create
命令显式创建一个卷,或者在创建容器或服务期间Docker可以创建一个卷。
创建卷时,它将存储在Docker主机的一个目录中。将卷装入容器时,此目录是装入容器的内容。这与绑定挂载的工作方式类似,区别在于卷由Docker管理,并与主机的核心功能隔离。
给定的体积可以同时安装到多个容器中。当没有正在运行的容器正在使用卷时,该卷仍然可用于Docker,并且不会自动删除。您可以使用docker volume prune
删除未使用的卷。
在安装卷时,可能会命名或匿名。首次将匿名卷挂载到容器时,匿名卷没有被赋予明确的名称,因此Docker会为它们提供一个随机名称,该名称在给定的Docker主机中保证是唯一的。除名称外,命名和匿名卷的行为方式相同。
卷还支持使用卷驱动程序,这些卷驱动程序可让您将数据存储在远程主机或云提供程序中,以及其他可能性。
- 绑定装载:自Docker早期开始提供。与卷相比,绑定安装具有有限的功能。当您使用绑定挂载时,主机上的文件或目录被挂载到容器中。文件或目录由主机上的完整路径引用。该文件或目录不需要已经存在于Docker主机上。如果它尚不存在,它会根据需求创建。绑定挂载非常高效,但它们依赖于具有特定目录结构的主机的文件系统。如果您正在开发新的Docker应用程序,请考虑使用命名卷。您不能使用Docker CLI命令直接管理绑定挂载。 警告:无论好坏,使用绑定挂载的一个副作用是您可以通过容器中运行的进程更改主机文件系统,包括创建,修改或删除重要的系统文件或目录。这是一个强大的能力,可能会对安全产生影响,包括影响主机系统上的非Docker进程。
- tmpfs挂载:
tmpfs
在Docker主机上或容器中,挂载不会永久保存在磁盘上。它可以在容器的生命周期内由容器使用,以存储非持久状态或敏感信息。例如,在内部,群集服务使用tmpfs
挂载将秘密装入服务的容器中。
使用-v
or --volume
标志可将绑定挂载和卷挂载到容器中,但每种语法的语法稍有不同。对于tmpfs
坐骑,您可以使用该--tmpfs
标志。但是,在Docker 17.06及更高版本中,我们建议将--mount
容器和服务的标志用于绑定挂载,卷或tmpfs
挂载,因为语法更清晰。
volumes的良好用例
volumes是在Docker容器和服务中保持数据的首选方式。volumes
的一些用例包括:
- 在多个运行容器之间共享数据。如果您没有明确创建它,则会在第一次将其装入容器时创建volumes。当该容器停止或被移除时,该volumes仍然存在。多个容器可以同时安装相同的卷,无论是读写还是只读。仅当您明确删除volumes时才会删除volumes。
- 当不能保证Docker主机具有给定的目录或文件结构时。卷帮助您将Docker主机的配置与容器运行时分离开来。
- 当您想要将容器的数据存储在远程主机或云提供商上而不是本地时。
- 当需要备份,还原或将数据从一台Docker主机迁移到另一台时,卷是更好的选择。您可以使用卷停止容器,然后备份卷的目录(如
/var/lib/docker/volumes/<volume-name>
)。
绑定安装的良好用例
通常,您应该在可能的情况下使用volumes。绑定挂载适用于以下类型的用例:
- 将配置文件从主机共享到容器。这就是Docker默认情况下通过挂载向容器提供dns解析的方式。
/etc/resolv.conf
从主机进入每个容器。
- 在Docker主机上的开发环境和容器之间共享源代码或构建构件。例如,您可以挂载一个Maven
target/
目录到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问重建的工件。
如果您以这种方式使用Docker进行开发,那么生产Dockerfile将直接将生产准备好的工件复制到映像中,而不是依赖绑定挂载。
- 当Docker主机的文件或目录结构保证与容器需要的绑定安装一致
tmpfs
时。对于不希望数据保存在主机上的情况,最好使用tmpfs安装挂载的良好用例,或者在容器内。这可能出于安全原因,或者在应用程序需要编写大量非持久状态数据时保护容器的性能。使用绑定挂载或卷的提示如果使用绑定挂载或卷,请记住以下几点:
- 如果容器的映像在装入点包含数据,则该数据将传播到绑定装入或卷。这是预先填充Docker主机需要的数据(在绑定挂载的情况下)或另一个容器需要(对于卷的情况)的好方法。
- 如果您将绑定挂载或卷挂载到已经写入文件或目录的容器中的某个目录中,则这些文件或目录会被挂载遮挡,就像您将文件保存到
/mnt
Linux主机中一样,然后挂载USB开车进入/mnt
。/mnt
在USB驱动器卸下之前,内容将被USB驱动器的内容遮盖。接下来的步骤为
- 详细了解volumes。
- 了解有关绑定挂载的更多信息。
- 了解关于tmpfs装载的更多信息。
- 了解更多关于存储驱动程序,它们与绑定挂载或卷无关,但允许您将数据存储在容器的可写层中。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com