挂载卷(Mounting Volume)在 Docker 中是一种将数据持久化的方法,它允许将一个目录或文件从宿主机挂载到容器内部。挂载卷可以是以下几种类型:
-
数据卷(Data Volume):
- 数据卷是 Docker 的一个特性,它在 Docker 宿主机上存储数据,并且可以在容器之间共享和重用。数据卷独立于容器的生命周期,即使容器被删除,数据卷中的数据也不会丢失。
-
数据卷容器(Data Volume Container, DVC):
- 数据卷容器是专门用于存储和管理数据卷的容器。它们可以作为数据卷的命名空间,使得数据卷的使用更加灵活。
-
绑定挂载(Bind Mount):
- 绑定挂载是将宿主机的文件或目录挂载到容器内部的文件系统上。这种挂载方式允许容器访问宿主机上的文件系统,并且对挂载点的更改会反映到宿主机上。
-
临时文件系统(Tmpfs Mount):
- 这种类型的挂载将容器内部的目录或文件挂载到内存中的临时文件系统。Tmpfs 挂载通常用于提高性能,因为内存读写速度比磁盘快,但数据在容器重启后会丢失。
挂载卷的使用场景包括:
- 数据持久化:使用数据卷来存储需要持久化的数据,如数据库文件、应用配置等。
- 数据共享:通过数据卷在多个容器之间共享数据。
- 性能优化:使用 Tmpfs 挂载来提高读写速度。
- 配置和密钥注入:通过绑定挂载将配置文件或密钥注入到容器中。
在 Docker Compose 中使用挂载卷的示例:
services:my_service:image: my_imagevolumes:- my_data_volume:/var/lib/my_service- /path/on/host:/path/in/containervolumes:my_data_volume:
my_data_volume
是一个命名的数据卷,my_data_volume就是名字,它不存在于宿主机中,只能通过docker volume命令看到,也就是只有容器才能访问,用于持久化服务的数据,相当于docker 开辟了一个特殊容器,这个容器只用来给别的容器当U盘。注意命名数据卷还需要全局声明,如最后一行。
/path/on/host:/path/in/container
是一个绑定挂载,将宿主机上的路径(/path/on/host)挂载到容器内部(/path/in/container),这样容器内部可以访问这个路径,但其实文件在宿主机上,类似于容器内和宿主机同步盘,可以单向传递密钥之类的只读文件,也可以作为双向的长期log文件夹。
Docker 挂载卷(Volumes)和宿主机的文件夹在使用上有一些关键的区别,这些区别主要体现在数据持久性、生命周期、可见性和使用场景上。以下是一些主要的区别:
-
生命周期:
- 挂载卷:Docker 卷的生命周期独立于容器,也独立于宿主机。即使容器被删除,卷中的数据仍然存在,直到显式地删除数据卷。
- 宿主机文件夹:宿主机上的文件夹的生命周期依赖于宿主机的文件系统。
-
数据持久性:
- 挂载卷:用于数据持久化,卷中的数据在容器停止或删除后仍然由docker保留,容器重启或者升级不会会丢失数据,而且宿主机中无法操作挂载卷。
- 宿主机文件夹:如果容器使用 bind mount 绑定宿主机上的文件夹,容器内的数据会反映到宿主机上,但宿主机上的文件夹删除后,容器内的数据也会丢失。
-
可见性:
- 挂载卷:仅 Docker 守护进程和容器可以访问卷,可以提供更好的数据隔离和安全性。
- 宿主机文件夹:宿主机上的其他应用程序和用户也可以访问宿主机上的文件夹,或者是其他挂载了宿主机文件夹的容器,可能会带来安全风险。
-
管理方式:
- 挂载卷:可以通过 Docker 的
volume
命令进行管理,如docker volume create
、docker volume ls
、docker volume rm
等。 - 宿主机文件夹:作为宿主机文件系统的一部分,使用宿主机的文件管理工具进行管理。
- 挂载卷:可以通过 Docker 的
-
使用场景:
- 挂载卷:适用于需要跨多个容器共享数据或持久化数据的场景。
- 宿主机文件夹:适用于需要临时共享数据或容器需要访问宿主机特定文件的场景。
-
隔离性:
- 挂载卷:提供了一定程度的隔离,卷中的数据不会影响宿主机的其他部分。
- 宿主机文件夹:与宿主机的文件系统直接相连,可能会受到宿主机上其他进程的影响。
举例:
1. 如果你需要密码文件才能让容器中的程序运行,但又不希望打包在容器镜像中,你可以让容器挂载宿主机的密码文件为只读。2. 如果你需要保存大量日志并宿主机中持久化保存或查询,那么可以挂载让容器挂载宿主机的某个文件,写入容器中的日志实际上是在宿主机中4. 如果你需要保存一些中间结果但容器被删除后也不丢失,同时不希望宿主机中的其他程序访问,那么保存在挂载卷中即可,它是docker单独管理并于宿主机隔离的docker u盘