实验五:数据卷管理 完整报告
一、实验目的
- 熟悉数据卷的基本工作原理;
- 掌握数据卷操作的常用命令;
- 熟悉数据卷容器的基本工作原理;
- 掌握数据卷容器操作的常用命令。
二、实验环境
- Ubuntu Linux
- Docker
- 本机用户:
we
三、实验步骤
实验一:数据卷的读写模式
步骤 1:创建宿主机目录并运行容器(rw 模式)
bashsudo 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。
宿主机验证:
bashcd /test_volcat 1.txt
预期:输出 123,说明 rw 模式可写。
步骤 2:运行只读模式容器(ro 模式)
bashdocker 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:创建匿名数据卷
bashdocker volume create myvolumedocker run -itd --name mybusybox -v myvolume:/data busybox:latest /bin/sh
步骤 2:查看数据卷信息
bashdocker inspect mybusybox | grep -A 10 "Mounts"
步骤 3:创建指定路径的数据卷
bashmkdir -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:查看所有数据卷
bashdocker 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:移除数据卷
bashdocker stop mybusybox_pdocker rm mybusybox_pdocker volume rm myvolume_p
实验三:数据卷的共享
步骤 1:创建数据卷并启动第一个容器
bashdocker volume create myvoldocker run -it --name mybusybox1 -v myvol:/data busybox:latest /bin/sh# 容器内cd /dataecho "share" > 1.txt
按 Ctrl+P Ctrl+Q 退出但保持容器运行。
步骤 2:启动第二个容器共享数据卷
bashdocker run -it --name mybusybox2 --volumes-from mybusybox1 --rm busybox:latest /bin/sh# 容器内ls /datacat /data/1.txtexit
预期:/data 下有 1.txt,内容为 share。exit 后 mybusybox2 因 --rm 自动删除。
实验四:数据卷的备份与迁移
方式一:使用 docker cp 命令备份
bashmkdir -p /tmp/backupdocker cp mybusybox1:/data /tmp/backup/ls /tmp/backup/datacat /tmp/backup/data/1.txt
预期:/tmp/backup/data/1.txt 存在,内容为 share。
方式二:通过挂载新旧卷实现迁移
bashdocker 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 run 报 docker: 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 myvolume 报 volume is in use
现象:
textError response from daemon: remove myvolume: volume is in use - [31b263542c74...]
原因:mybusybox 容器还在使用 myvolume。
解决:
bashdocker 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
六、实验总结
- rw 模式下,容器可以对挂载目录读写;ro 模式下,容器只能读,写入会报
Read-only file system。 - 数据卷可以用
docker volume create创建,支持匿名卷和绑定宿主机目录两种方式。 --volumes-from可以让多个容器共享同一个数据卷,实现数据互通。- 数据卷备份有两种常用方式:
docker cp直接从容器复制到宿主机;- 挂载新旧两个卷,用
cp命令在容器内完成迁移。
- 删除卷前必须确保没有容器在使用它,否则会报
volume is in use。 - 那些哈希值命名的卷是匿名卷,可用
docker volume prune清理。
实验五完成。



