你是某公司运维/DevOps 实习生。现在需要在一台 Linux 服务器上完成**Web 服务上线、巡检、排障、数据传递、迁移备份、下线清理**等生产常见流程。要求你使用 Docker 完成对应操作并提交证据。
> 统一要求:实验过程**全程使用命令行**完成(浏览器验证可作为补充截图)。
## 场景 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 进程退出 → 容器退出**。



Nginx 容器的默认启动命令/docker-entrypoint.sh会启动 Nginx 并保持前台运行(通过daemon off;参数),因此容器会持续处于Up状态;
## 场景 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`)

docker exec 是 "附加" 到运行中的容器执行命令,不会终止容器主进程(Nginx 前台进程),因此退出容器后容器仍运行;
若用 docker attach 进入容器,退出时可能导致容器停止(需用 Ctrl+P+Q 脱离),而 docker exec 更安全,是生产环境进入容器的首选方式。
## 场景 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`

docker cp 命令无需容器进入交互状态,只要容器处于 Up 状态即可执行(web-prod-01 本身是后台运行的 Nginx 容器,满足条件);
若容器处于 Exited 状态,docker cp 仍可执行(Docker 会临时挂载容器文件系统完成复制);
复制路径注意:~ 代表宿主机当前用户的家目录,容器内无 ~ 快捷路径,需写绝对路径(如 /opt/)。
## 场景 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 句话以内)

docker export 导出的是容器 "快照"(仅当前文件系统状态),不包含镜像的历史构建层和元数据(如 ENV、CMD 等);
docker import 创建的镜像需手动指定启动命令(如 docker run 时加 /docker-entrypoint.sh),否则默认无启动命令;
docker save 导出的是镜像,可包含多个标签,导入后镜像历史、配置与原镜像一致。
## 场景 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 网络模式场景化
实验说明
-
实验环境:单台 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 模式下端口映射的作用是什么?


为什么外部不能直接访问容器 IP?
容器 IP 是 Docker bridge 网桥分配的私有 IP(如 172.17.0.2),仅宿主机和同网桥容器可访问;外部网络(如物理机 / 其他服务器)无到该私有网段的路由,且 Docker 未将容器 IP 暴露到宿主机网卡,因此外部无法直接访问。
bridge 模式下端口映射的作用是什么?
端口映射(-p)将宿主机的公网 / 内网端口(如 8080)与容器端口(如 80)绑定,让外部网络通过访问宿主机端口,间接转发到容器内服务,实现容器服务对外暴露。
## 场景二:host 模式------高性能服务部署
场景背景(生产化)
公司部署一个**高性能 Web 服务/监控服务**:
-
对网络性能敏感
-
不希望端口映射带来额外开销
因此直接让容器使用宿主机网络。
学生任务
### 任务 2.1:使用 host 网络模式启动 nginx
### 任务 2.2:查看网络信息
验证要求
-
访问方式:`http://宿主机IP:80`
-
不需要 `-p` 参数
-
容器内看到的 IP 信息与宿主机一致
## 思考题(必答)
1️⃣ host 模式下,容器有没有独立 IP?
2️⃣ host 模式适合什么类型的应用?
3️⃣ host 模式的安全风险是什么?


host 模式下,容器有没有独立 IP?
没有。host 模式容器复用宿主机网络命名空间,无独立 IP,容器内看到的 IP / 端口均为宿主机的,与宿主机共享同一网络栈。
host 模式适合什么类型的应用?
适合对网络性能要求极高(无端口映射转发开销)、需要直接使用宿主机端口的应用,如高性能 Web 服务、监控采集服务、大数据传输服务等。
host 模式的安全风险是什么?
容器直接暴露在宿主机网络中,无网络隔离,容器内的服务 / 进程可直接访问宿主机所有网络资源,若容器被入侵,攻击者可直接利用宿主机网络权限横向渗透;同时容器端口与宿主机端口冲突风险高,易导致服务异常。
## 场景三:container 模式------紧密耦合服务(Sidecar)
场景背景(生产化)
某系统由两个组件组成:
-
主服务(Service)
-
辅助服务(日志/监控/代理)
要求:
-
两个容器**共享网络**
-
使用 `localhost` 通信
学生任务
### 任务 3.1:启动主容器
### 任务 3.2:查看主容器网络命名空间
### 任务 3.3:启动共享网络的辅助容器
### 任务 3.4:对比两个容器的网络
验证要求
-
两个容器 **IP 完全一致**
-
网络命名空间相同
-
可通过 `localhost` 通信
## 思考题(必答)
1️⃣ container 模式与 host 模式的区别?
2️⃣ 为什么称这种模式为 Sidecar(边车模式)?


执行 docker inspect 查看 sidecar-service 的 IP 时无输出,是因为 container 模式下,辅助容器的 NetworkSettings.Networks 字段为空------ 该模式下辅助容器完全复用主容器的网络命名空间,Docker 不会为其单独记录 IP 信息,属于正常现象,需用替代方式验证 IP 一致性。
container 模式与 host 模式的区别?
container 模式复用指定容器的网络命名空间(仅两个容器共享),host 模式复用宿主机的网络命名空间(容器与宿主机共享);container 模式容器有独立于宿主机的 IP,host 模式无独立 IP。
为什么称这种模式为 Sidecar(边车模式)?
Sidecar 容器如同主服务容器的 "边车",与主容器共享网络 / 存储等资源,不直接提供业务功能,而是为主体提供辅助能力(日志、监控、代理),且通过 localhost 通信,轻量化且耦合度低,符合边车模式的设计理念。
## 场景四:自定义 bridge 网络------多容器系统与固定 IP
场景背景(生产化)
公司部署一个多服务系统:
-
Web + App + DB
-
需要:
-
容器间直连
-
可指定 IP
-
网络与其他项目隔离
学生任务
### 任务 4.1:创建自定义网络
### 任务 4.2:在自定义网络中启动容器
### 任务 4.3:容器间通信测试
验证要求
-
自定义网络出现在 `docker network ls`
-
容器 IP 为指定值
-
容器间可直接通信
## 思考题(必答)
1️⃣ 为什么默认 bridge 不能指定 IP?
2️⃣ 自定义网络适合什么场景?
3️⃣ Docker 如何实现容器间二层通信?


为什么默认 bridge 不能指定 IP?
默认 bridge 网络为简化设计,采用动态 IP 分配策略,无手动指定 IP 的配置接口,且未开放子网 / IP 管控能力,仅满足基础隔离需求。
自定义网络适合什么场景?
适合多服务系统部署(如 Web+App+DB),需要容器固定 IP、网络隔离(与其他项目网络分隔)、容器间直连通信的场景。
Docker 如何实现容器间二层通信?
Docker 通过创建 Linux 网桥(bridge),将容器虚拟网卡(veth pair)挂载到网桥上,网桥作为二层交换设备,实现容器间的二层(数据链路层)通信。