如何在 Docker 容器中将主机目录挂载为卷

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker 是用于将应用程序容器化的强大工具,但管理数据可能是一项挑战。在本教程中,你将学习如何将主机目录挂载为 Docker 容器中的卷,从而能够在主机和容器之间持久化和共享数据。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/SystemManagementGroup -.-> docker/info("Display System-Wide Information") subgraph Lab Skills docker/create -.-> lab-411577{{"如何在 Docker 容器中将主机目录挂载为卷"}} docker/cp -.-> lab-411577{{"如何在 Docker 容器中将主机目录挂载为卷"}} docker/volume -.-> lab-411577{{"如何在 Docker 容器中将主机目录挂载为卷"}} docker/info -.-> lab-411577{{"如何在 Docker 容器中将主机目录挂载为卷"}} end

理解 Docker 卷

Docker 卷是一种持久化 Docker 容器所生成数据的方式。卷提供了一种独立于容器生命周期来存储和管理数据的方法,使得数据能够在容器之间共享,并且即使容器停止或删除后数据依然能够持久保存。

卷可用于存储各种数据,包括应用程序数据、配置文件和日志。它们可以挂载到容器内的特定位置,使容器能够根据需要访问和修改数据。

Docker 卷有几种类型,包括:

命名卷

命名卷由 Docker 创建和管理,并存储在由 Docker 管理的主机文件系统中的某个位置。命名卷通常用于存储需要在容器生命周期之外持久保存的应用程序数据。

绑定挂载

绑定挂载允许你将主机文件系统中的一个目录直接挂载到容器中。这对于在主机和容器之间共享数据,或者挂载存储在主机上的配置文件或其他资源很有用。

匿名卷

匿名卷在容器运行时创建,并且没有被赋予名称。它们通常用于不需要在容器生命周期之外持久保存的临时存储。

卷可用于各种场景,例如:

  • 存储需要在容器生命周期之外持久保存的应用程序数据
  • 在多个容器之间共享数据
  • 从主机文件系统挂载配置文件或其他资源
  • 备份和恢复容器中的数据

总体而言,Docker 卷是一项强大的功能,它允许你以独立于容器生命周期的方式管理和持久化数据。

将主机目录挂载为卷

将主机目录挂载为 Docker 容器中的卷是一种常见的用例,因为它允许你在主机和容器之间共享数据,并使数据在容器生命周期之外持久保存。

要将主机目录挂载为卷,你可以在运行 Docker 容器时使用 -v--mount 标志。以下是使用 -v 标志的示例:

docker run -v /host/path:/container/path image:tag

在此示例中,/host/path 是你要挂载的主机文件系统上的路径,/container/path 是容器内将挂载该卷的路径。

你也可以使用 --mount 标志将主机目录挂载为卷:

docker run --mount type=bind,source=/host/path,target=/container/path image:tag

type=bind 选项指定我们正在将主机目录挂载为卷,sourcetarget 选项分别指定主机和容器路径。

需要注意的是,在将主机目录挂载为卷之前,该主机目录必须已经存在。如果目录不存在,Docker 将为你创建它。

以下是一个在 Docker 容器中使用挂载的主机目录的示例:

## 在主机上创建一个目录
mkdir /host/data

## 运行一个容器并将主机目录挂载为卷
docker run -v /host/data:/app/data image:tag

在此示例中,我们在主机上创建了一个目录 /host/data,然后将其作为卷挂载到容器内的 /app/data 路径。在容器内写入 /app/data 的任何数据都将持久保存在主机文件系统上。

总体而言,将主机目录挂载为 Docker 容器中的卷是在主机和容器之间共享和持久保存数据的强大方式。

示例与最佳实践

示例

以下是一些关于如何在 Docker 容器中将挂载的主机目录用作卷的示例:

  1. 存储应用程序数据:挂载主机目录以存储需要在容器生命周期之外持久保存的应用程序数据。
docker run -v /host/app-data:/app/data image:tag
  1. 共享配置文件:挂载主机目录以在主机和容器之间共享配置文件。
docker run -v /host/config:/app/config image:tag
  1. 备份数据:挂载主机目录以从容器中备份数据。
docker run -v /host/backups:/backups image:tag backup.sh

最佳实践

以下是在 Docker 容器中将主机目录挂载为卷的一些最佳实践:

  1. 使用命名卷:虽然绑定挂载很有用,但通常最好使用命名卷,因为它们更具可移植性且更易于管理。
  2. 避免挂载敏感数据:挂载敏感数据(如密码或 API 密钥)时要小心,因为这可能会将它们暴露给主机上的其他容器或进程。
  3. 使用一致的挂载路径:在容器内使用一致的挂载路径,以便更轻松地管理和维护应用程序。
  4. 验证挂载权限:确保运行容器的用户或组具有读取和写入挂载卷的必要权限。
  5. 使用卷管理工具:考虑使用 Docker Compose 或 Kubernetes 等卷管理工具来简化在容器之间管理和共享卷的过程。
  6. 监控卷使用情况:监控挂载卷的使用情况,以确保它们不会在主机上占用过多磁盘空间。
  7. 备份和恢复卷:定期备份挂载的卷,以确保在发生故障或灾难时可以恢复数据。

通过遵循这些最佳实践,你可以在 Docker 容器中有效地将挂载的主机目录用作卷,确保数据安全、可移植且易于管理。

总结

在本教程结束时,你将对 Docker 卷以及如何在 Docker 容器中将主机目录挂载为卷有扎实的理解。你还将学习管理 Docker 卷的最佳实践,以确保容器化应用程序的可靠性和可移植性。