Volumes
和 Bind Mounts
是 Docker 提供的两种存储方式
主要区别:
Volumes
类似于一个快捷方式。它通过挂载一个管理的卷到容器的指定目录来实现数据持久化。起初,当宿主机没有创建该卷时,Docker 会自动根据容器中的内容创建一个卷文件。但如果宿主机的指定卷目录已经有文件,那么卷中的内容将以宿主机的文件为准,容器将使用宿主机卷中的内容。
Bind Mounts
类似于将宿主机的文件夹直接挂载到容器内,就像把宿主机的目录挂载到容器中作为“U盘”一样。最初,如果宿主机的目录为空,容器内的目录也会为空;如果宿主机的目录已经有内容,容器将直接使用宿主机目录中的文件。
1. 存储位置
- Volumes:
- 由 Docker 管理,存储在 Docker 的默认目录(如
/var/lib/docker/volumes/
)中,用户通常不需要直接与这些文件交互。 - Docker 会自动为你管理这些存储位置,不需要你手动指定路径。
- 在默认情况下,Docker 会为每个 volume 创建一个新的目录,并在该目录中保存数据。
- 适用于数据持久化,尤其是在容器重启或删除时,可以保证数据不丢失。
- 由 Docker 管理,存储在 Docker 的默认目录(如
- Bind Mounts:
- 将宿主机的指定目录挂载到容器内。也就是说,宿主机上的一个具体路径与容器内的路径建立映射。
- 宿主机目录和容器内目录是同步的,容器对目录的修改会直接反映到宿主机。
- 用户必须指定宿主机上的路径,并且这些路径通常是本地磁盘上的目录。
2. 默认内容
- Volumes:
- 默认情况下,
Volumes
是空的。如果 Docker 创建了一个新的 volume,它会初始化为一个空的文件夹。容器第一次启动时,Docker 会自动将该 volume 挂载到容器指定的目录,并且容器可以开始写入数据。 - 用户不需要手动管理 volume 的内容,Docker 会处理其生命周期。
- 默认情况下,
- Bind Mounts:
- Bind Mounts 会挂载宿主机上的现有目录或文件。如果宿主机上指定的目录不存在,Docker 会自动创建它(如果是目录的话),但这个目录在创建时通常为空。
- 如果你指定的宿主机目录已经存在,Docker 会直接使用该目录,容器内对这个目录的任何修改都会影响宿主机的目录。
3. 使用场景
- Volumes:
- 适用于 数据持久化,例如数据库存储、日志文件、容器需要存储大量数据等场景。
- 更适合 生产环境,因为 Docker 管理着它们,用户无需关心底层实现。
- 可与多个容器共享,使得跨容器的数据管理变得更加简便。
- Bind Mounts:
- 更适合 开发环境,例如在开发过程中,你可能希望容器内的代码文件能够实时反映到宿主机上,或者容器需要访问宿主机上的某些配置文件。
- 容器与宿主机共享文件时,可以方便地进行调试、修改和查看文件。
- 如果你需要挂载宿主机上某个特定目录(例如配置文件、日志文件等),可以使用 Bind Mounts。
4. 权限管理
- Volumes:
- 由 Docker 管理,Docker 会处理权限问题,通常容器对 volume 中的数据有足够的读写权限。
- Bind Mounts:
- 直接映射宿主机上的目录或文件,因此需要注意宿主机目录的权限。容器必须具备对该宿主机目录的读取和写入权限,否则可能会导致权限问题。
5. 性能
- Volumes:
- 由于由 Docker 管理,
Volumes
提供了更高效的文件系统操作,尤其在容器间共享数据时,性能更优。
- 由于由 Docker 管理,
- Bind Mounts:
- 因为直接与宿主机文件系统交互,如果宿主机的文件系统性能较差,可能会影响到容器性能。
6. 数据持久性
- Volumes:
- 数据会在容器删除后继续保留,除非手动删除 volume。适合持久化存储。
- 可以跨容器使用,当一个容器删除时,其他使用该 volume 的容器数据不会丢失。
- Bind Mounts:
- 数据存储在宿主机上,容器删除后数据不会丢失,但需要手动管理路径和文件。适合开发时需要频繁修改文件的场景。
总结对比
特性 | Volumes | Bind Mounts |
---|---|---|
存储位置 | Docker 管理,默认存储在 Docker 内部 | 宿主机上的指定路径 |
默认内容 | 空目录,Docker 管理数据 | 挂载宿主机已有目录或文件 |
使用场景 | 适用于持久化存储,多个容器共享数据 | 适用于开发时共享文件或调试 |
管理 | 由 Docker 管理 | 由用户管理,依赖宿主机路径 |
性能 | 优化的性能 | 可能会受宿主机文件系统影响 |
权限管理 | Docker 自动处理 | 需要手动处理宿主机文件权限 |
数据持久性 | 容器删除后数据依然存在,跨容器使用 | 容器删除后数据仍然在宿主机上,但需手动管理 |
结论
大部分情况下是用Volumes
- Volumes 更适合用作持久化存储,特别是对于生产环境中的数据库和其他需要持续保存的数据。
- Bind Mounts 更适合开发环境中,尤其是当需要容器与宿主机直接共享文件或目录时。