LabHub
学习 学习路径 课程

卷、网络与 Compose

卷与挂载

在 LabHub 中继续学习

本实验在真正的 VM 中运行

这个环境不是 Pod,而是由 KubeVirt 启动的虚拟机。Linux 内核独立运行,systemd 真正管理服务,docker 也不是模拟工具,而是真正的 Docker 引擎。通过 docker run 启动的容器会成为实际进程,docker execdocker logs 也都能照常工作。

过去,这个实验在 Pod 中运行。由于该环境放弃了所有内核权限,启动容器的步骤无法进行,因此只能学习直接解开镜像归档的变通方法。现在不再需要绕路了。

有两点需要了解。

目标

亲手创建卷、绑定挂载和只读挂载,确认删除容器后数据依然保留,并验证备份与恢复可以完成往返。

为什么重要

“容器不保存状态”并不是说容器无法处理状态,而是要求你将状态放在容器之外。如果无法理解这一区别,要么每次重新部署都会丢失数据,要么卷越积越多,却没有人敢删除。还有一点:只读挂载并非性能设置,而是对意图的声明。如果在清单中写明这个容器不应写入哪些位置,那么日后违反该规则的代码一经部署,就不会悄无声息地蒙混过去,而会明确报错。

步骤

  1. 创建 /root/ops1,并创建一个名为 dk-data 的命名卷。
  2. 使用名为 dk-writer 的容器将 dk-data 挂载到 /data,并向 /data/hello.txt 写入 volume-alive
  3. 删除 dk-writer 容器,然后使用新容器读取同一个卷,确认内容是否仍然存在,并将输出保存到 /root/ops1/persist.txt
  4. 创建 /root/ops1/site/index.html 并写入 labhub-site,启动 nginx:1.27-alpine,命名为 dk-site,同时将 /root/ops1/site 绑定挂载到 /usr/share/nginx/html
  5. 启动 dk-ro 容器,将 dk-data 只读挂载到 /data;在容器中尝试写入文件,并将得到的错误消息保存到 /root/ops1/ro-error.txt
  6. 启动 dk-site2 容器并使用 --mount 语法,挂载与第 4 步相同的源和目标,但设为只读
  7. dk-data 卷的内容备份到 /root/ops1/dk-data.tgz。归档中必须包含 hello.txt
  8. 创建名为 dk-data-restore 的新卷并恢复备份。其内容必须与原卷相同。

参考

创建命名卷

创建 /root/ops1,并创建一个名为 dk-data 的命名卷。

有一组专门操作卷的子命令。这里只需创建卷,暂时不需要容器。

向卷中写入文件

使用名为 dk-writer 的容器将 dk-data 挂载到 /data,并向 /data/hello.txt 写入 volume-alive

启动容器,挂载卷并写入文件。请为容器命名——下一步会删除这个名称对应的容器。

删除容器后数据是否仍存在

删除 dk-writer 容器,然后使用新容器读取同一个卷,确认内容是否仍然存在,并将输出保存到 /root/ops1/persist.txt

删除写入文件的容器,再使用新容器读取同一个卷。还要将确认到的内容保存到文件。

直接挂载主机目录

创建 /root/ops1/site/index.html 并写入 labhub-site,启动 nginx:1.27-alpine,命名为 dk-site,同时将 /root/ops1/site 绑定挂载到 /usr/share/nginx/html

绑定挂载直接指定主机路径。挂载到 nginx 的默认文档根目录后即可立即检查。

以只读方式挂载

启动 dk-ro 容器,将 dk-data 只读挂载到 /data;在容器中尝试写入文件,并将得到的错误消息保存到 /root/ops1/ro-error.txt

在挂载选项中添加只读标志,并在容器内尝试写入,将产生的错误消息原样保存。

改用 --mount 语法

启动 dk-site2 容器并使用 --mount 语法,挂载与第 4 步相同的源和目标,但设为只读

结果应与简短语法相同。将 type、source、target、readonly 用逗号连接。

备份卷

dk-data 卷的内容备份到 /root/ops1/dk-data.tgz。归档中必须包含 hello.txt

使用一个同时挂载卷和备份目标目录的临时容器。必须用 -C 进入源目录,才能保持路径整洁。

恢复到新卷

创建名为 dk-data-restore 的新卷并恢复备份。其内容必须与原卷相同。

创建新卷并将归档解压进去。内容必须与原卷完全相同。