介绍
本章节将涵盖在 Docker 环境中使用持久化数据存储(称为数据卷,Volumes)的方法。你将学习持久化数据存储的特性,例如内部卷与外部卷的区别,以及如何以及何时使用它们。
数据卷管理
数据卷是 Docker 中实现数据持久化的标准操作。在本节中,我将带你通过实际操作掌握数据卷的标准管理流程。
目标
你的目标是使用 docker 命令创建一个名为 my-vol 的数据卷,并在该卷中添加一个名为 test.txt 的文件。
结果示例
以下是你在完成此挑战后应能达到的效果示例:
- 创建一个名为
my-vol的数据卷。
labex:~/ $ docker volume ls
DRIVER VOLUME NAME
local jenkins-data
local minikube
local my-vol
- 通过数据卷详情获取挂载点(
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"
}
]
- 进入挂载点目录并创建
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 容器中。
结果示例
以下是你在完成此挑战后应能达到的效果示例:
- 创建一个名为
nginx-vol的数据卷。
labex:~/ $ docker volume ls
DRIVER VOLUME NAME
local jenkins-data
local minikube
local my-vol
local nginx-vol
- 基于 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
- 将
/home/labex/project/index.html文件复制到nginx容器中。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
- 验证文件是否已成功复制到
nginx容器。
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world
要求
要完成此挑战,你需要:
- 了解如何使用
docker命令创建数据卷。 - 了解如何启动容器。
- 了解如何将本地文件复制到容器中。
使用宿主机路径创建容器
在许多情况下,我们可能不习惯使用 Docker 管理的数据卷,而是直接使用宿主机的原生目录进行数据持久化(即绑定挂载)。在本节中,我们将使用宿主机目录来创建容器。
目标
你的目标是创建一个使用「宿主机路径」(Host Path)的容器,然后将 /home/labex/project/nginx.txt 文件复制到容器中,并验证容器内的文件与宿主机路径中的文件是否一致。
结果示例
以下是你在完成此挑战后应能达到的效果示例:
- 在
/tmp目录下创建一个nginx目录。
labex:/tmp/ $ ls | grep nginx
nginx
- 基于
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
- 使用
docker inspect命令检查具体的挂载详情。
"Mounts": [
{
"Type": "bind",
"Source": "/tmp/nginx",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
- 将
/home/labex/project/nginx.txt文件复制到nginx-host容器的/usr/share/nginx/html目录。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
- 验证容器内是否存在该文件。
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
- 检查本地宿主机的
/tmp/nginx目录,确认是否存在nginx.txt文件。
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx
要求
要完成此挑战,你需要:
- 明确你想要使用的宿主机路径。
- 了解如何在容器内部使用相关命令来验证是否可以访问宿主机目录或文件。
- 了解如何使用宿主机路径启动容器。
- 熟悉基本的 Linux 命令,如
cd、mkdir、touch等。
容器间共享数据
在容器化环境中,有时需要在容器之间共享数据。在这种情况下,可以使用多种技术来实现数据共享。本挑战将探索如何在容器之间共享数据。
目标
你的目标是实现两个容器之间的数据共享。具体来说,你将使用「宿主机路径」启动容器 A,然后启动另一个容器 B 并挂载容器 A 的存储卷,最终实现两个容器之间的数据互通。
结果示例
以下是你在完成此挑战后应能达到的效果示例:
- 在本地宿主机上创建一个
/tmp/share目录。
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
- 基于
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
- 基于
busybox镜像创建一个名为busybox-share的容器,并从nginx-share容器挂载卷。
labex:/tmp/ $ docker ps | grep busy
30bf04aee681 busybox "sh" 43 seconds ago Up 42 seconds busybox-share
- 将
/home/labex/project/share.txt文件复制到busybox-share容器。
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
- 验证
nginx-share容器中是否存在该文件。
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
- 进入
busybox-share容器查看share.txt文件是否存在。
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share
要求
要完成此挑战,你需要:
- 熟悉 Docker 容器的基本操作和概念。
- 使用 Docker 命令行工具创建、运行和停止容器。
- 理解数据卷的概念和用法。
- 理解如何在容器中挂载数据卷。
- 熟悉基本的 Linux 命令,如
cd、mkdir、touch等。
总结
恭喜你完成了这次挑战!如果你现在已经能够熟练地在容器中使用存储卷,那就继续保持,迎接更多的挑战吧。



