容器中的数据管理

DockerDockerBeginner
立即练习

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

简介

容器技术通过提供隔离、轻量级和可移植的环境,彻底改变了应用程序的部署方式。然而,在容器内管理数据带来了独特的挑战,特别是在确保数据在容器生命周期中的持久性方面。本挑战将指导你掌握在 Docker 容器中有效管理数据的关键技术。

你将学习如何创建和使用 Docker 卷(volumes),将其挂载到容器中,从卷中读写数据,以及执行备份和恢复操作。这些技能对于开发需要持久存储的健壮容器化应用程序至关重要。

让我们开始探索 Docker 容器中的数据管理。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/run -.-> lab-15896{{"容器中的数据管理"}} docker/exec -.-> lab-15896{{"容器中的数据管理"}} docker/inspect -.-> lab-15896{{"容器中的数据管理"}} docker/volume -.-> lab-15896{{"容器中的数据管理"}} end

创建 Docker 卷

在本步骤中,你将创建一个 Docker 卷(volume),这是一个用于独立于容器存储持久数据的托管对象。

任务

  1. 使用 docker volume create 命令创建一个名为 myvolume 的新 Docker 卷。
  2. 列出所有 Docker 卷以验证 myvolume 的创建。

要求

  • 所有操作需在 /home/labex/project 目录下完成。
  • 创建卷时使用默认的卷驱动(volume driver)。

示例

完成此步骤后,运行 docker volume ls 应显示类似以下输出:

DRIVER    VOLUME NAME
local     myvolume
✨ 查看解决方案并练习

在容器中挂载 Docker 卷

现在我们已经有了一个卷,接下来将其挂载到容器中。本步骤将演示如何为正在运行的容器提供持久存储。

任务

  1. 基于 nginx 镜像运行一个名为 my-container 的新 Docker 容器。
  2. myvolume 卷挂载到容器内的 /app/data 路径。
  3. 使用 docker inspect 命令验证卷是否正确挂载。

要求

  • 所有操作需在 /home/labex/project 目录下完成。
  • 以分离模式(detached mode)运行容器。
  • 启动容器时使用 -v 选项挂载卷。

示例

运行容器后,docker inspect my-container 应显示包含以下内容的输出:

"Mounts": [
    {
        "Type": "volume",
        "Name": "myvolume",
        "Source": "/var/lib/docker/volumes/myvolume/_data",
        "Destination": "/app/data",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
]
✨ 查看解决方案并练习

向 Docker 卷写入数据

在本步骤中,你将学习如何向挂载的 Docker 卷写入数据,从而实现即使容器被删除,数据也能持久保存。

任务

  1. 使用 docker exec 命令访问 my-container 容器。
  2. 在容器内的 /app/data 目录中创建一个名为 hello.txt 的文件。
  3. 将内容 "Hello, World!" 写入 hello.txt 文件。

要求

  • 所有操作需在 /home/labex/project 目录下完成。
  • 使用 echo 命令将内容写入文件。

示例

执行命令后,你应该能够看到该文件:

$ docker exec my-container ls /app/data
hello.txt
✨ 查看解决方案并练习

从 Docker 卷读取数据

现在我们已经向卷中写入了数据,接下来验证我们是否可以读取这些数据,以展示跨容器操作的数据持久性。

任务

  1. 使用 docker exec 命令访问 my-container 容器。
  2. 读取并显示 /app/data/hello.txt 文件的内容。

要求

  • 所有操作需在 /home/labex/project 目录下完成。
  • 使用 cat 命令显示文件内容。

示例

命令的输出应为:

Hello, World!
✨ 查看解决方案并练习

备份和恢复 Docker 卷

在最后一步中,你将学习如何备份 Docker 卷中的数据并将其恢复到新卷中,这对于数据迁移和灾难恢复场景至关重要。

任务

  1. myvolume 卷的数据备份为 /home/labex/project 目录下的 myvolume.tar.gz 压缩包。
  2. 创建一个名为 mynewvolume 的新 Docker 卷。
  3. 将备份数据恢复到 mynewvolume 中。

要求

  • 所有操作需在 /home/labex/project 目录下完成。
  • 在备份和恢复操作期间,使用带有 --rm 选项的 docker run 命令运行临时容器。

示例

完成备份和恢复过程后,验证新卷的内容应显示:

$ docker run --rm -v mynewvolume:/app/data alpine cat /app/data/hello.txt
Hello, World!
✨ 查看解决方案并练习

总结

在本挑战中,你获得了在 Docker 容器中管理数据的实践经验。你学习了如何:

  1. 创建和管理 Docker 卷
  2. 将卷挂载到容器
  3. 向卷写入数据并从卷读取数据
  4. 备份卷数据并将其恢复到新卷

这些技能对于开发需要持久存储的健壮容器化应用程序至关重要。在你继续 Docker 学习之旅时,请记住,有效的数据管理对于维护应用程序状态、确保数据持久性以及促进顺畅的操作流程至关重要。

对于更高级的场景,你可以考虑探索用于云存储集成的卷驱动(volume drivers)、实施自动化备份策略,并研究卷如何与 Docker Swarm 和 Kubernetes 交互以实现分布式存储解决方案。