实验三:容器管理 实验报告
一、实验目的
- 熟悉容器的基本工作原理;
- 掌握容器操作的常用命令。
二、实验环境
- Ubuntu 20.04 / Linux
- Docker
- Shell:zsh / bash
三、实验内容
- 练习使用容器操作的常用命令;
- 掌握创建、启动、查看、停止、删除、进入容器等操作。
四、完整操作步骤
1. 配置镜像加速器(可选,实验二已配可跳过)
bashsudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{ "registry-mirrors": ["https://docker.m.daocloud.io"]}EOFsudo systemctl daemon-reloadsudo systemctl restart docker# 验证docker info | grep -A 5 "Registry Mirrors"
2. 拉取 busybox 镜像
bashdocker pull busybox
验证:
bashdocker images
3. 创建容器 busybox1
bashdocker create --name busybox1 busybox
说明:docker create 只创建容器,不启动。
4. 创建并启动交互式容器 test5
bashdocker run -it --name test5 busybox sh
进入容器后可以看到 / # 提示符,说明已经进入 busybox 容器内部。
可以在容器内执行:
bashlspwdecho hello
退出但保持容器运行:
textCtrl + PCtrl + Q
注意:不要按
exit,否则容器主进程结束,容器会停止。
5. 查看本地容器信息
bash# 正在运行的容器docker ps# 所有容器,包括已停止的docker ps -a# 最近一次创建的容器docker ps -l# 最近创建的 5 个容器docker ps -n 5
6. 查看容器详细信息与 IP
bashdocker inspect test5
查看容器 IP:
bashdocker start test5docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' test5
预期输出示例:
text172.17.0.2
实验文档中写的
NetworkSetting少了一个s,正确写法是NetworkSettings。
7. 查看容器日志
bash# 持续跟踪日志并加时间戳,显示最后 10 行docker logs -f -t --tail 10 test5# 查看最近 30 分钟日志docker logs --since 30m test5# 查看最后 10 行并加时间戳docker logs -t --tail=10 test5
实验文档中写的
--f --t应为-f -t。
8. 停止、启动、重启、杀死容器
bashdocker stop test5docker start test5docker restart test5docker kill test5
强制停止一个容器:
bashdocker kill test5# 或docker stop -t 0 test5
9. 进入容器
方法一:docker exec(推荐)
bashdocker start test5docker exec -it test5 sh
退出方式:
- 输入
exit:只退出这个 exec 的 shell,容器继续运行; - 或按
Ctrl+P Ctrl+Q:脱离容器,容器继续运行。
方法二:docker attach
bashdocker attach test5
退出方式:
textCtrl + PCtrl + Q
不要按
Ctrl+C,否则可能导致容器停止。
10. 删除容器
bash# 先停止容器docker stop test5# 删除容器docker rm test5# 强制删除运行中的容器docker rm -f test5
删除所有容器:
bash# 先停止所有正在运行的容器docker stop $(docker ps -q)# 再删除所有容器docker rm $(docker ps -a -q)
如果仍有运行中的容器导致删除失败:
bashdocker rm -f $(docker ps -a -q)
验证:
bashdocker ps -a
11. 创建 test6 并挂载数据卷,然后删除容器与数据卷
bash# 以 ubuntu:14.04 为基础镜像启动容器 test6,并挂载 /homedocker run -dit --name test6 -v /home ubuntu:14.04# 查看容器docker ps# 停止容器docker stop test6# 删除容器并删除关联数据卷docker rm -v test6# 验证docker ps -a
实验文档中提到的
httpd01可能是笔误,这里按test6完成。
12. 清理所有容器并最终验证
bashdocker stop $(docker ps -q) 2>/dev/nulldocker rm $(docker ps -a -q) 2>/dev/nulldocker rm -f $(docker ps -a -q) 2>/dev/nulldocker ps -a
最终预期输出:只剩表头,没有任何容器。
textCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
五、遇到的问题和解决方法
| 问题 | 原因 | 解决方法 |
|---|---|---|
docker exec -it test5 sh 报 container is not running |
容器已停止 | 先执行 docker start test5 |
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' test5 返回 invalid IP |
容器未运行,没有分配 IP | 先启动容器,再查看 IP |
docker rm -v test6 报 container is running |
容器正在运行,不能直接删除 | 先 docker stop test6,再 docker rm -v test6 |
docker stop $(docker ps -q) 报 requires at least 1 argument |
当前没有正在运行的容器 | 正常现象,可忽略,或加 2>/dev/null |
docker rm busybox1 报 No such container |
该容器已经被之前批量删除 | 正常现象,说明已经清理干净 |
docker rm $(docker ps -a -q) 报 cannot remove running container |
有容器还在运行 | 先 docker stop,或使用 docker rm -f |
实验文档写 docker exec --it |
参数写法错误 | 正确写法是 docker exec -it |
实验文档写 NetworkSetting |
少了一个 s |
正确写法是 NetworkSettings |
实验文档写 docker logs --f --t |
参数写法不规范 | 正确写法是 docker logs -f -t |
六、证明完成实验的命令
以下命令可用于截图证明实验完成。
1. 证明镜像已拉取
bashdocker images
预期:能看到 busybox、ubuntu:14.04 等镜像。
2. 证明创建容器成功
bashdocker create --name busybox1 busybox
预期:返回容器 ID。
3. 证明启动容器成功
bashdocker run -it --name test5 busybox sh
预期:进入容器,显示 / #。
4. 证明查看容器信息成功
bashdocker psdocker ps -adocker ps -ldocker ps -n 5
预期:能看到 test5、busybox1 等容器信息。
5. 证明查看容器 IP 成功
bashdocker start test5docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' test5
预期输出:172.17.0.2 或类似 IP。
6. 证明查看日志成功
bashdocker logs -t --tail=10 test5
预期:显示带时间戳的容器日志。
7. 证明停止、启动、重启、杀死成功
bashdocker stop test5docker start test5docker restart test5docker kill test5
预期:分别返回容器名 test5。
8. 证明进入容器成功
bashdocker start test5docker exec -it test5 sh
预期:进入容器,显示 / #。
bashdocker attach test5
预期:进入容器,按 Ctrl+P Ctrl+Q 可退出且容器不停止。
9. 证明删除容器成功
bashdocker stop test5docker rm test5docker rm -f test5
预期:返回 test5 或提示不存在。
10. 证明删除所有容器成功
bashdocker stop $(docker ps -q) 2>/dev/nulldocker rm $(docker ps -a -q) 2>/dev/nulldocker rm -f $(docker ps -a -q) 2>/dev/nulldocker ps -a
预期:docker ps -a 只剩表头。
11. 证明 test6 挂载数据卷并删除卷成功
bashdocker run -dit --name test6 -v /home ubuntu:14.04docker psdocker stop test6docker rm -v test6docker ps -a
预期:test6 被创建、停止、删除,docker ps -a 中不再有 test6。
12. 最终验证
bashdocker ps -a
预期输出:
textCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
表示所有容器已清理完毕。
七、实验心得
- 容器是镜像的运行实例,镜像相当于模板,容器相当于运行中的程序。
docker run相当于docker create + docker start。docker exec适合进入运行中的容器,退出后容器通常继续运行。docker attach连接到容器主进程,退出时建议使用Ctrl+P Ctrl+Q,不要随意按Ctrl+C。- 删除容器前必须先停止容器,或使用
docker rm -f强制删除。 docker rm -v可以同时删除容器关联的数据卷。- 批量清理容器时,先停止所有容器,再删除所有容器,可以避免 “cannot remove running container” 错误。
- 实验文档中存在一些旧语法或笔误,例如
--filters、--it、NetworkSetting,实际使用时需要根据当前 Docker 版本修正。
八、最终结果
docker ps -a输出只剩表头,说明所有容器已删除;docker images中镜像仍然保留,说明镜像与容器相互独立;- 实验三“容器管理”完成。





