Docker 场景化作业:生产环境容器操作实训

一、作业目标

学生要求

* 容器操作:创建 / 启动 / 停止 / 查看

* 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:把宿主机文件复制到容器

要求:

  1. 在宿主机创建文件 `~/test.txt`,内容为学号+姓名(例:`2025xxx 张三`)

  2. 复制到容器 `/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 句话以内)

  1. save/load 针对镜像(含分层),export/import 针对容器快照(扁平化);
  2. export 会丢失镜像历史和元数据,save 可完整保留;
  3. 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:批量停止所有容器(两种方式任选其一)

任选提交一种:

  1. `docker stop $(docker ps -q)`

  2. `docker ps -a | awk ... | xargs docker stop`

提交证据:命令 + 执行后 `docker ps`

任务 6.3:删除所有容器

任选提交一种:

  1. `docker rm -f $(docker ps -aq)`

  2. `docker ps -a | awk ... | xargs docker rm`

提交证据:命令 + `docker ps -a`(结果为空)

任务 6.4:批量删除镜像(两种方式任选其一)

任选提交一种:

  1. 删除所有镜像:`docker rmi -f $(docker images -q)`

  2. 只删除 none 镜像:`docker images | grep none | ...`

提交证据:命令 + `docker images`(展示删除结果)

> 安全说明(必答):为什么生产环境不建议直接执行"删除所有容器/镜像"?写出 2 点原因。

  1. 易误删运行中的核心业务容器 / 依赖镜像,导致服务中断且无快速恢复能力;
  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

  1. 网络命名空间:host 模式共享宿主机的,container 模式共享指定容器的,而非宿主机;
  2. IP 与端口:host 模式复用宿主机 IP / 端口,container 模式复用目标容器的 IP / 端口;
  3. 隔离性:host 模式无网络隔离(与宿主机共用),container 模式仅与目标容器共享网络,与宿主机 / 其他容器仍隔离。

2

Sidecar 模式得名于其与主应用容器共享网络、存储等资源且职责独立的特性,类比摩托车的边车:

  1. 主应用容器是 "摩托车主体",负责核心业务功能;Sidecar 容器是 "边车",负责日志收集、监控、服务网格代理等辅助功能。
  2. 两者共享同一网络命名空间(通常用 container 网络模式),可通过 localhost 直接通信,无需端口映射,就像边车紧贴摩托车一样紧密协同。
  3. 边车容器不侵入主应用代码,独立部署和升级,实现了辅助功能与核心业务的解耦

场景四:自定义 bridge 网络------多容器系统与固定 IP

场景背景(生产化)

公司部署一个多服务系统:

* Web + App + DB

* 需要:

* 容器间直连

* 可指定 IP

* 网络与其他项目隔离

* * *

学生任务

任务 4.1:创建自定义网络

任务 4.2:在自定义网络中启动容器

任务 4.3:容器间通信测试

* * *

验证要求

* 自定义网络出现在 `docker network ls`

* 容器 IP 为指定值

* 容器间可直接通信

思考题(必答)

1️⃣ 为什么默认 bridge 不能指定 IP? 2️⃣ 自定义网络适合什么场景? 3️⃣ Docker 如何实现容器间二层通信?

1、

  1. 默认 bridge 网络未提供静态 IP 分配的原生支持,Docker 自动分配 IP 且无冲突检测,手动指定易引发 IP 冲突;
  2. 默认 bridge 下容器重启 IP 易变动,指定静态 IP 会破坏网络稳定性,需自定义网桥实现该需求

2、

  1. 需为容器分配静态 IP、自定义网段 / 网关,或需精细化管控容器间网络通信(如访问策略)的场景;
  2. 多容器协同部署(如微服务),需稳定的容器名解析、避免默认 bridge 网络 IP 变动导致服务不可用的场景;
  3. 生产环境需隔离不同业务的容器网络,降低跨业务网络干扰、提升安全性的场景。

3、

  1. Docker 主要通过网桥(默认 bridge / 自定义网络)实现容器间二层通信,网桥作为虚拟交换机,让同网络的容器通过二层数据链路层交互;
  2. 同网桥内容器共享同一二层网络域,可通过容器 IP 直接通信,无需路由转发,Docker 会维护网桥的 MAC 地址表实现数据帧转发;
  3. 自定义网络还可通过配置实现跨网桥二层通信,而默认 bridge 也依托网桥完成基础的二层数据交换。
相关推荐
bs_1012 小时前
k8s工作运维中常用命令
运维·容器·kubernetes
Fortune_yangyang2 小时前
Docker 生产环境容器化
运维·docker·容器
虫小宝2 小时前
电商返利APP容器编排实践:K8s在多环境部署中的资源调度优化
云原生·容器·kubernetes
苹果醋32 小时前
vue + iview + vue-i18n中英翻译
java·运维·spring boot·mysql·nginx
QH_ShareHub2 小时前
SSH 隧道:如何让本机借用服务器网络
运维·ssh·php
网硕互联的小客服2 小时前
服务器中的IPV4和IPV6有什么区别?那个比较好?
运维·服务器·ip
Teable任意门互动2 小时前
飞书多维表格vsTeable 如何选?把握“内外兼修”是关键决策点
运维·自动化·飞书·数据库开发·wps
bing_feilong2 小时前
ubuntu如何开机运行一个python3脚本?
linux·运维·ubuntu
Autumn72992 小时前
超算 HPC使用 (集群1):SSH免密登录
运维·ssh