一、作业目标
学生要求
* 容器操作:创建 / 启动 / 停止 / 查看
* docker run 创建+启动合并,并且后台持续运行
* 容器交互:`docker exec -it`
* 文件复制:`docker cp`(主机→容器、容器→主机)
* 容器迁移:`docker export` / `docker import`
* 下线清理:删除容器、批量停止、删除所有容器、批量删除镜像
* (加分)网络:bridge/host/container/none、自定义网络、端口映射
二、任务清单(按场景完成)
场景 1:上线发布(创建+启动合并,后台运行)
任务 1.1:用 nginx 镜像创建并启动容器(后台运行)
要求:
* 容器名:`web-prod-01`
* 端口映射:宿主机 `43000` 映射容器 `80`
* 后台运行:必须使用 `-d`
提交证据:
* `docker ps` 输出(能看到端口映射)
* 浏览器访问 `http://宿主机IP:43000` 的截图(或 curl 输出)


场景 2:基础操作(创建、启动、停止、查看)
任务 2.1:使用 docker create 创建容器(默认停止)
要求:
* 使用 `docker create -it nginx:latest /bin/bash`(或按你环境可用镜像)
* 证明容器状态是 `Created`
提交证据:
* `docker ps -a` 输出(状态为 Created)

任务 2.2:启动该容器并查看状态
提交证据:
* `docker start <容器ID或名称>` 命令
* `docker ps -a` 输出(状态为 Up 或 Exited 需解释原因)

任务 2.3:停止容器
提交证据:
* `docker stop <容器ID或名称>`
* `docker ps -a` 输出(状态为 Exited)
> 提示:如果 nginx 容器用 `/bin/bash` 作为 PID1,有时会退出,要写明原因:**PID=1 进程退出 → 容器退出**。

场景 3:排障进入容器(容器交互)
任务 3.1:进入 web-prod-01 容器执行命令
要求进入容器执行:
* `ls`
* `cat /etc/os-release`(若镜像无该文件,可换 `uname -a`)
提交证据:
* `docker exec -it web-prod-01 /bin/sh` 或 `/bin/bash` 过程截图(含命令与输出)
* 说明:退出容器后容器仍在运行(给出 `docker ps`)

* * *
场景 4:文件复制(主机↔容器)
任务 4.1:把宿主机文件复制到容器
要求:
-
在宿主机创建文件 `~/test.txt`,内容为学号+姓名(例:`2025xxx 张三`)
-
复制到容器 `/opt/` 目录
提交证据:
* 宿主机:`cat ~/test.txt`
* `docker cp ~/test.txt web-prod-01:/opt/`
* 容器内验证:`cat /opt/test.txt`(用 exec 进入或直接 exec 执行)


任务 4.2:从容器复制回宿主机
要求:
* 从容器复制 `/opt/test.txt` 到宿主机 `~/abc123.txt`
提交证据:
* `docker cp web-prod-01:/opt/test.txt ~/abc123.txt`
* `cat ~/abc123.txt`

场景 5:容器迁移(导出与导入)
任务 5.1:导出容器为 tar 包
要求:
* 导出 `web-prod-01` 为 `web-prod-01.tar`
提交证据:
* `docker export web-prod-01 > web-prod-01.tar`
* `ls -lh web-prod-01.tar`

任务 5.2:导入 tar 包生成新镜像
要求:
* 镜像名:`web-import:test`
提交证据:
* `cat web-prod-01.tar | docker import - web-import:test`
* `docker images | grep web-import`

> 说明题(必答):`export/import` 和 `save/load` 有什么区别?(写 3 句话以内)
- save/load 针对镜像(含分层),export/import 针对容器快照(扁平化);
- export 会丢失镜像历史和元数据,save 可完整保留;
- save 支持多镜像打包,export 仅能导出单个容器。
场景 6:下线与清理(删除与批量删除)
任务 6.1:删除指定容器
要求:
* 停止并删除 `web-prod-01`
提交证据:
* `docker stop web-prod-01`
* `docker rm web-prod-01`
* `docker ps -a | grep web-prod-01`(无输出或说明不存在)

任务 6.2:批量停止所有容器(两种方式任选其一)
任选提交一种:
-
`docker stop $(docker ps -q)`
-
`docker ps -a | awk ... | xargs docker stop`
提交证据:命令 + 执行后 `docker ps`

任务 6.3:删除所有容器
任选提交一种:
-
`docker rm -f $(docker ps -aq)`
-
`docker ps -a | awk ... | xargs docker rm`
提交证据:命令 + `docker ps -a`(结果为空)

任务 6.4:批量删除镜像(两种方式任选其一)
任选提交一种:
-
删除所有镜像:`docker rmi -f $(docker images -q)`
-
只删除 none 镜像:`docker images | grep none | ...`
提交证据:命令 + `docker images`(展示删除结果)

> 安全说明(必答):为什么生产环境不建议直接执行"删除所有容器/镜像"?写出 2 点原因。
- 易误删运行中的核心业务容器 / 依赖镜像,导致服务中断且无快速恢复能力;
- 批量删除会清空镜像分层缓存,后续重建容器需重新拉取所有镜像,消耗大量网络资源且延长恢复时间。
三、网络部分
* 下面是一套**"Docker 网络模式(除 none)场景化作业"**,专门给学生做实验用,覆盖 \**bridge / host / container / 自定义网络(bridge 派生)\** 四种模式。 每个模式都给了**真实生产场景背景 → 学生操作任务 → 验证点 → 思考题**
Docker 网络模式场景化作业
实验说明
* 实验环境:单台 Linux 主机(物理机/虚拟机均可)
* 镜像建议:`nginx`、`centos:7`
* 禁止使用 `--network none`
* 每个场景**必须执行命令并给出验证结果**
* * *
场景一:bridge 模式(默认模式)------Web 服务对外发布
场景背景(生产化)
公司在一台服务器上部署多个 Web 服务,需要:
* 容器之间相互隔离
* 对外通过端口映射提供服务
这是**最常见的生产 Docker 网络模式**。
学生任务
任务 1.1:使用 bridge 模式运行 nginx
任务 1.2:查看容器 IP
任务 1.3:访问服务
* 浏览器访问:`http://宿主机IP:8080`
* 或命令:
* * *
验证要求
* `docker ps` 中能看到端口映射
* 能通过宿主机端口访问容器服务
* 容器拥有**独立 IP**


## 思考题(必答)
1️⃣ 为什么外部不能直接访问容器 IP? 2️⃣ bridge 模式下端口映射的作用是什么?
1、容器 IP 属于宿主机的私有虚拟网络,未暴露到公网 / 外部网络
2、核心作用是打通外部网络与容器私有网络的访问链路
## 场景二:host 模式------高性能服务部署
场景背景(生产化)
公司部署一个**高性能 Web 服务/监控服务**:
* 对网络性能敏感
* 不希望端口映射带来额外开销因此直接让容器使用宿主机网络。
* * *
学生任务
任务 2.1:使用 host 网络模式启动 nginx
任务 2.2:查看网络信息
* * *
验证要求
* 访问方式:`http://宿主机IP:80`
* 不需要 `-p` 参数
* 容器内看到的 IP 信息与宿主机一致



## 思考题(必答)
1️⃣ host 模式下,容器有没有独立 IP? 2️⃣ host 模式适合什么类型的应用? 3️⃣ host 模式的安全风险是什么?
1、Docker host 网络模式下,容器没有独立 IP 地址。
2、核心适配标准是 对网络性能要求高、需绑定宿主机特定端口、依赖宿主机网络环境
3、源于容器与宿主机共享网络命名空间;网络隔离失效,权限边界模糊;端口暴露无限制,攻击面扩大;容器逃逸风险升高;难以精细化管控网络流量
场景三:container 模式------紧密耦合服务(Sidecar)
场景背景(生产化)
某系统由两个组件组成:
* 主服务(Service)
* 辅助服务(日志/监控/代理)要求:
* 两个容器**共享网络**
* 使用 `localhost` 通信
* * *
学生任务
任务 3.1:启动主容器
任务 3.2:查看主容器网络命名空间
任务 3.3:启动共享网络的辅助容器
任务 3.4:对比两个容器的网络
* * *
验证要求
* 两个容器 **IP 完全一致**
* 网络命名空间相同
* 可通过 `localhost` 通信



## 思考题(必答)
1️⃣ container 模式与 host 模式的区别? 2️⃣ 为什么称这种模式为 Sidecar(边车模式)?
1
- 网络命名空间:host 模式共享宿主机的,container 模式共享指定容器的,而非宿主机;
- IP 与端口:host 模式复用宿主机 IP / 端口,container 模式复用目标容器的 IP / 端口;
- 隔离性:host 模式无网络隔离(与宿主机共用),container 模式仅与目标容器共享网络,与宿主机 / 其他容器仍隔离。
2
Sidecar 模式得名于其与主应用容器共享网络、存储等资源且职责独立的特性,类比摩托车的边车:
- 主应用容器是 "摩托车主体",负责核心业务功能;Sidecar 容器是 "边车",负责日志收集、监控、服务网格代理等辅助功能。
- 两者共享同一网络命名空间(通常用
container网络模式),可通过localhost直接通信,无需端口映射,就像边车紧贴摩托车一样紧密协同。 - 边车容器不侵入主应用代码,独立部署和升级,实现了辅助功能与核心业务的解耦
场景四:自定义 bridge 网络------多容器系统与固定 IP
场景背景(生产化)
公司部署一个多服务系统:
* Web + App + DB
* 需要:
* 容器间直连
* 可指定 IP
* 网络与其他项目隔离
* * *
学生任务
任务 4.1:创建自定义网络
任务 4.2:在自定义网络中启动容器
任务 4.3:容器间通信测试
* * *
验证要求
* 自定义网络出现在 `docker network ls`
* 容器 IP 为指定值
* 容器间可直接通信



思考题(必答)
1️⃣ 为什么默认 bridge 不能指定 IP? 2️⃣ 自定义网络适合什么场景? 3️⃣ Docker 如何实现容器间二层通信?
1、
- 默认 bridge 网络未提供静态 IP 分配的原生支持,Docker 自动分配 IP 且无冲突检测,手动指定易引发 IP 冲突;
- 默认 bridge 下容器重启 IP 易变动,指定静态 IP 会破坏网络稳定性,需自定义网桥实现该需求
2、
- 需为容器分配静态 IP、自定义网段 / 网关,或需精细化管控容器间网络通信(如访问策略)的场景;
- 多容器协同部署(如微服务),需稳定的容器名解析、避免默认 bridge 网络 IP 变动导致服务不可用的场景;
- 生产环境需隔离不同业务的容器网络,降低跨业务网络干扰、提升安全性的场景。
3、
- Docker 主要通过网桥(默认 bridge / 自定义网络)实现容器间二层通信,网桥作为虚拟交换机,让同网络的容器通过二层数据链路层交互;
- 同网桥内容器共享同一二层网络域,可通过容器 IP 直接通信,无需路由转发,Docker 会维护网桥的 MAC 地址表实现数据帧转发;
- 自定义网络还可通过配置实现跨网桥二层通信,而默认 bridge 也依托网桥完成基础的二层数据交换。