实验五:数据卷管理 完整报告

2026-09-21我也不知道取什么名字👁 1 阅读📝 806 字9 分钟阅读💬 0 评论
实验五:数据卷管理 完整报告

实验五:数据卷管理 完整报告

一、实验目的

  1. 熟悉数据卷的基本工作原理;
  2. 掌握数据卷操作的常用命令;
  3. 熟悉数据卷容器的基本工作原理;
  4. 掌握数据卷容器操作的常用命令。

二、实验环境

  • Ubuntu Linux
  • Docker
  • 本机用户:we

三、实验步骤

实验一:数据卷的读写模式

步骤 1:创建宿主机目录并运行容器(rw 模式)

bash
sudo mkdir /test_voldocker run -itd --name mybusybox -v /test_vol:/data:rw busybox:latest /bin/shdocker attach mybusyboxcd /dataecho "123" > 1.txtcat 1.txt

预期:容器内输出 123

宿主机验证:

bash
cd /test_volcat 1.txt

预期:输出 123,说明 rw 模式可写

步骤 2:运行只读模式容器(ro 模式)

bash
docker run -itd --name mybusybox_ro -v /test_vol:/data:ro busybox:latest /bin/shdocker attach mybusybox_rocd /dataecho "456" > 1.txt

预期报错:

text
/bin/sh: can't create 1.txt: Read-only file system

说明 ro 模式不可写


实验二:数据卷的管理

步骤 1:创建匿名数据卷

bash
docker volume create myvolumedocker run -itd --name mybusybox -v myvolume:/data busybox:latest /bin/sh

步骤 2:查看数据卷信息

bash
docker inspect mybusybox | grep -A 10 "Mounts"

步骤 3:创建指定路径的数据卷

bash
mkdir -p /test_pdocker volume create --driver local --opt type=none --opt device=/test_p --opt o=bind myvolume_pdocker run -itd --name mybusybox_p -v myvolume_p:/data busybox:latest /bin/shdocker attach mybusybox_pcd /dataecho "hello world" > 2.txtexit# 宿主机验证cat /test_p/2.txt

预期:输出 hello world

注意:实验文档中使用 myvolume 作为绑定卷名,但 myvolume 已被匿名卷占用,会报名字冲突。改用 myvolume_p 解决。

步骤 4:查看所有数据卷

bash
docker volume lsdocker volume inspect myvolume_p

inspect 输出应显示:

json
{    "CreatedAt": "...",    "Driver": "local",    "Mountpoint": "/var/lib/docker/volumes/myvolume_p/_data",    "Name": "myvolume_p",    "Options": {        "device": "/test_p",        "o": "bind",        "type": "none"    },    "Scope": "local"}

步骤 5:移除数据卷

bash
docker stop mybusybox_pdocker rm mybusybox_pdocker volume rm myvolume_p

实验三:数据卷的共享

步骤 1:创建数据卷并启动第一个容器

bash
docker volume create myvoldocker run -it --name mybusybox1 -v myvol:/data busybox:latest /bin/sh# 容器内cd /dataecho "share" > 1.txt

Ctrl+P Ctrl+Q 退出但保持容器运行。

步骤 2:启动第二个容器共享数据卷

bash
docker run -it --name mybusybox2 --volumes-from mybusybox1 --rm busybox:latest /bin/sh# 容器内ls /datacat /data/1.txtexit

预期:/data 下有 1.txt,内容为 shareexitmybusybox2--rm 自动删除。


实验四:数据卷的备份与迁移

方式一:使用 docker cp 命令备份

bash
mkdir -p /tmp/backupdocker cp mybusybox1:/data /tmp/backup/ls /tmp/backup/datacat /tmp/backup/data/1.txt

预期:/tmp/backup/data/1.txt 存在,内容为 share

方式二:通过挂载新旧卷实现迁移

bash
docker volume create newvoldocker run -it --name mybusybox3 -v myvol:/data -v newvol:/newdata busybox:latest /bin/sh# 容器内cp /data/* /newdata/ls /newdatacat /newdata/1.txtexit

预期:/newdata/1.txt 内容为 share


四、遇到的问题及解决方法

问题 1:容器内执行 docker rundocker: not found

现象

text
/data # docker run -it --name mybusybox2 --volumes-from mybusybox1 --rm busybox:latest /bin/sh/bin/sh: docker: not found

原因docker 命令属于宿主机,容器内部没有 Docker 客户端。

解决:先按 Ctrl+P Ctrl+Q 退出容器(保持运行),回到宿主机再执行 docker run


问题 2:docker volume rm myvolumevolume is in use

现象

text
Error response from daemon: remove myvolume: volume is in use - [31b263542c74...]

原因mybusybox 容器还在使用 myvolume

解决

bash
docker ps -a | grep 31b263542c74   # 找到容器名docker stop mybusyboxdocker rm mybusyboxdocker volume rm myvolume

问题 3:容器内 cd /test_vol 失败

现象

text
/bin/sh: cd: can't cd to /test_vol: No such file or directory

原因/test_vol 是宿主机目录,容器内通过 -v /test_vol:/data 挂载后,容器内看到的是 /data,而不是 /test_vol

解决:在容器内 cd /data,在宿主机 cd /test_vol 验证。


五、证明实验完成的命令

bash
# 实验一:读写模式sudo mkdir /test_voldocker run -itd --name mybusybox -v /test_vol:/data:rw busybox:latest /bin/shdocker attach mybusyboxcd /data && echo "123" > 1.txt && cat 1.txt# 宿主机cat /test_vol/1.txtdocker run -itd --name mybusybox_ro -v /test_vol:/data:ro busybox:latest /bin/shdocker attach mybusybox_rocd /data && echo "456" > 1.txt   # 应报 Read-only file system# 实验二:数据卷管理docker volume create myvolumedocker run -itd --name mybusybox -v myvolume:/data busybox:latest /bin/shdocker inspect mybusybox | grep -A 10 "Mounts"mkdir -p /test_pdocker volume create --driver local --opt type=none --opt device=/test_p --opt o=bind myvolume_pdocker run -itd --name mybusybox_p -v myvolume_p:/data busybox:latest /bin/shdocker attach mybusybox_pcd /data && echo "hello world" > 2.txt && exitcat /test_p/2.txtdocker volume lsdocker volume inspect myvolume_pdocker stop mybusybox_p && docker rm mybusybox_p && docker volume rm myvolume_p# 实验三:数据卷共享docker volume create myvoldocker run -it --name mybusybox1 -v myvol:/data busybox:latest /bin/sh# 容器内:echo "share" > /data/1.txt# Ctrl+P Ctrl+Q 退出docker run -it --name mybusybox2 --volumes-from mybusybox1 --rm busybox:latest /bin/sh# 容器内:ls /data && cat /data/1.txt# 实验四:备份与迁移mkdir -p /tmp/backupdocker cp mybusybox1:/data /tmp/backup/ls /tmp/backup/data && cat /tmp/backup/data/1.txtdocker volume create newvoldocker run -it --name mybusybox3 -v myvol:/data -v newvol:/newdata busybox:latest /bin/sh# 容器内:cp /data/* /newdata/ && ls /newdata && cat /newdata/1.txt# 清理docker stop mybusybox1 mybusybox3docker rm mybusybox1 mybusybox3docker volume rm myvol newvol myvolumedocker volume prune

六、实验总结

  1. rw 模式下,容器可以对挂载目录读写;ro 模式下,容器只能读,写入会报 Read-only file system
  2. 数据卷可以用 docker volume create 创建,支持匿名卷绑定宿主机目录两种方式。
  3. --volumes-from 可以让多个容器共享同一个数据卷,实现数据互通。
  4. 数据卷备份有两种常用方式:
    • docker cp 直接从容器复制到宿主机;
    • 挂载新旧两个卷,用 cp 命令在容器内完成迁移。
  5. 删除卷前必须确保没有容器在使用它,否则会报 volume is in use
  6. 那些哈希值命名的卷是匿名卷,可用 docker volume prune 清理。

实验五完成。

我也不知道取什么名字
技术博客作者
806 字 · 0 评论
2026-09-21

评论 (0)

暂无评论,来写第一条吧

登录后发表评论