Docker 数据卷管理

DockerBeginner
立即练习

介绍

本章节将涵盖在 Docker 环境中使用持久化数据存储(称为数据卷,Volumes)的方法。你将学习持久化数据存储的特性,例如内部卷与外部卷的区别,以及如何以及何时使用它们。

这是一个「挑战」项目,它与「引导实验」不同,你需要尝试独立完成挑战任务,而不是按照实验步骤一步步学习。挑战通常具有一定的难度。如果你觉得困难,可以与 Labby 讨论或查看解决方案。历史数据显示,这是一个 初学者 级别的挑战,通过率为 89%。它在学习者中获得了 87% 的好评率。

数据卷管理

数据卷是 Docker 中实现数据持久化的标准操作。在本节中,我将带你通过实际操作掌握数据卷的标准管理流程。

目标

你的目标是使用 docker 命令创建一个名为 my-vol 的数据卷,并在该卷中添加一个名为 test.txt 的文件。

结果示例

以下是你在完成此挑战后应能达到的效果示例:

  1. 创建一个名为 my-vol 的数据卷。
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. 通过数据卷详情获取挂载点(Mountpoint)。
[
  {
    "CreatedAt": "2024-01-20T17:37:33+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
    "Name": "my-vol",
    "Options": {},
    "Scope": "local"
  }
]
  1. 进入挂载点目录并创建 test.txt 文件。
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt

要求

要完成此挑战,你需要:

  • 了解如何使用 docker 命令创建数据卷。
  • 使用 root 用户创建文件。
  • 使用 sudo su 切换到 root 用户,使用 sudo passwd root 设置 root 用户密码。
✨ 查看解决方案并练习

使用数据卷创建容器

在本节中,我们将使用 Docker 数据卷创建容器,并进行文件副本操作。

目标

你的目标是创建一个名为 nginx-vol 的 Docker 数据卷,然后启动一个名为 nginx 的容器并挂载该卷,最后将 /home/labex/project/index.html 文件复制到 nginx 容器中。

结果示例

以下是你在完成此挑战后应能达到的效果示例:

  1. 创建一个名为 nginx-vol 的数据卷。
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. 基于 nginx 镜像创建一个名为 nginx 的容器,将其 /usr/share/nginx/html 目录挂载到 nginx-vol 数据卷。
labex:~/ $ docker ps | grep nginx
c39296aaf39e   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 31 seconds   80/tcp    nginx
  1. /home/labex/project/index.html 文件复制到 nginx 容器中。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. 验证文件是否已成功复制到 nginx 容器。
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world

要求

要完成此挑战,你需要:

  • 了解如何使用 docker 命令创建数据卷。
  • 了解如何启动容器。
  • 了解如何将本地文件复制到容器中。
✨ 查看解决方案并练习

使用宿主机路径创建容器

在许多情况下,我们可能不习惯使用 Docker 管理的数据卷,而是直接使用宿主机的原生目录进行数据持久化(即绑定挂载)。在本节中,我们将使用宿主机目录来创建容器。

目标

你的目标是创建一个使用「宿主机路径」(Host Path)的容器,然后将 /home/labex/project/nginx.txt 文件复制到容器中,并验证容器内的文件与宿主机路径中的文件是否一致。

结果示例

以下是你在完成此挑战后应能达到的效果示例:

  1. /tmp 目录下创建一个 nginx 目录。
labex:/tmp/ $ ls | grep nginx
nginx
  1. 基于 nginx 镜像启动 nginx-host 容器,将宿主机的 /tmp/nginx 目录挂载到容器内的 /usr/share/nginx/html 目录。
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 43 seconds   80/tcp    nginx-host
  1. 使用 docker inspect 命令检查具体的挂载详情。
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. /home/labex/project/nginx.txt 文件复制到 nginx-host 容器的 /usr/share/nginx/html 目录。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. 验证容器内是否存在该文件。
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. 检查本地宿主机的 /tmp/nginx 目录,确认是否存在 nginx.txt 文件。
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx

要求

要完成此挑战,你需要:

  • 明确你想要使用的宿主机路径。
  • 了解如何在容器内部使用相关命令来验证是否可以访问宿主机目录或文件。
  • 了解如何使用宿主机路径启动容器。
  • 熟悉基本的 Linux 命令,如 cdmkdirtouch 等。
✨ 查看解决方案并练习

容器间共享数据

在容器化环境中,有时需要在容器之间共享数据。在这种情况下,可以使用多种技术来实现数据共享。本挑战将探索如何在容器之间共享数据。

目标

你的目标是实现两个容器之间的数据共享。具体来说,你将使用「宿主机路径」启动容器 A,然后启动另一个容器 B 并挂载容器 A 的存储卷,最终实现两个容器之间的数据互通。

结果示例

以下是你在完成此挑战后应能达到的效果示例:

  1. 在本地宿主机上创建一个 /tmp/share 目录。
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. 基于 nginx 镜像创建一个名为 nginx-share 的容器,并将本地 /tmp/share 目录挂载到容器内的 /usr/share/nginx/html 目录。
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39   nginx     "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   80/tcp    nginx-share
  1. 基于 busybox 镜像创建一个名为 busybox-share 的容器,并从 nginx-share 容器挂载卷。
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. /home/labex/project/share.txt 文件复制到 busybox-share 容器。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. 验证 nginx-share 容器中是否存在该文件。
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. 进入 busybox-share 容器查看 share.txt 文件是否存在。
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share

要求

要完成此挑战,你需要:

  • 熟悉 Docker 容器的基本操作和概念。
  • 使用 Docker 命令行工具创建、运行和停止容器。
  • 理解数据卷的概念和用法。
  • 理解如何在容器中挂载数据卷。
  • 熟悉基本的 Linux 命令,如 cdmkdirtouch 等。
✨ 查看解决方案并练习

总结

恭喜你完成了这次挑战!如果你现在已经能够熟练地在容器中使用存储卷,那就继续保持,迎接更多的挑战吧。