卷与挂载
本实验在真正的 VM 中运行
这个环境不是 Pod,而是由 KubeVirt 启动的虚拟机。Linux 内核独立运行,systemd 真正管理服务,docker 也不是模拟工具,而是真正的 Docker 引擎。通过 docker run 启动的容器会成为实际进程,docker exec 和 docker logs 也都能照常工作。
过去,这个实验在 Pod 中运行。由于该环境放弃了所有内核权限,启动容器的步骤无法进行,因此只能学习直接解开镜像归档的变通方法。现在不再需要绕路了。
有两点需要了解。
- **首次启动大约需要 1 分钟。**因为 VM 需要启动并安装 Docker,比 Pod 实验(通常 40 秒)更慢。
- **没有浏览器预览。**进入 VM 的连接只开放评分端口。如果启动了 Web 服务器,请在 VM 内使用
curl检查。
目标
亲手创建卷、绑定挂载和只读挂载,确认删除容器后数据依然保留,并验证备份与恢复可以完成往返。
为什么重要
“容器不保存状态”并不是说容器无法处理状态,而是要求你将状态放在容器之外。如果无法理解这一区别,要么每次重新部署都会丢失数据,要么卷越积越多,却没有人敢删除。还有一点:只读挂载并非性能设置,而是对意图的声明。如果在清单中写明这个容器不应写入哪些位置,那么日后违反该规则的代码一经部署,就不会悄无声息地蒙混过去,而会明确报错。
步骤
- 创建
/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。 - 启动
dk-ro容器,将dk-data只读挂载到/data;在容器中尝试写入文件,并将得到的错误消息保存到/root/ops1/ro-error.txt。 - 启动
dk-site2容器并使用--mount语法,挂载与第 4 步相同的源和目标,但设为只读。 - 将
dk-data卷的内容备份到/root/ops1/dk-data.tgz。归档中必须包含hello.txt。 - 创建名为
dk-data-restore的新卷并恢复备份。其内容必须与原卷相同。
参考
- 临时工作容器可以使用
docker run --rm启动,这样无需后续清理。 - 备份命令形如
docker run --rm -v dk-data:/source:ro -v /root/ops1:/backup alpine:3.20 tar czf /backup/dk-data.tgz -C /source .。 - 常见错误 1:如果第 5 步中的容器立即退出,就不会留下评分对象。请让它持续在后台运行。
- 常见错误 2:如果第 7 步不使用
-C,将绝对路径原样打包,恢复时路径会错位。
创建命名卷
创建 /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 的新卷并恢复备份。其内容必须与原卷相同。
创建新卷并将归档解压进去。内容必须与原卷完全相同。