一、作业目标

学生要求

  • 容器操作:创建 / 启动 / 停止 / 查看
  • 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-01web-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/importsave/load 有什么区别?(写 3 句话以内)
操作对象不同:export/import针对容器,save/load针对镜像。
内容不同:export仅含容器文件系统,save含镜像完整历史层。
用途不同:export/import用于容器迁移,save/load用于镜像备份


场景 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 点原因。
误删风险:可能删除正在运行的业务容器 / 依赖镜像,导致服务中断。
数据丢失:容器内未持久化的数据会随容器删除而丢失,镜像删除后无法快速恢复。

三、网络部分

  • 下面是一套**“Docker 网络模式(除 none)场景化作业”,专门给学生做实验用,覆盖 *bridge / host / container / 自定义网络(bridge 派生)* 四种模式。
    每个模式都给了
    真实生产场景背景 → 学生操作任务 → 验证点 → 思考题**


    Docker 网络模式场景化作业

    实验说明

    • 实验环境:单台 Linux 主机(物理机/虚拟机均可)
    • 镜像建议:nginxcentos:7
    • 禁止使用 --network none
    • 每个场景必须执行命令并给出验证结果

    场景一:bridge 模式(默认模式)——Web 服务对外发布

    场景背景(生产化)

    公司在一台服务器上部署多个 Web 服务,需要:

    • 容器之间相互隔离
    • 对外通过端口映射提供服务

    这是最常见的生产 Docker 网络模式


    学生任务

    任务 1.1:使用 bridge 模式运行 nginx

在这里插入图片描述

任务 1.2:查看容器 IP

在这里插入图片描述

任务 1.3:访问服务

  • 浏览器访问:http://宿主机IP:8080
  • 或命令:
    在这里插入图片描述

验证要求

  • docker ps 中能看到端口映射
  • 能通过宿主机端口访问容器服务
  • 容器拥有独立 IP
    在这里插入图片描述

思考题(必答)

1️⃣ 为什么外部不能直接访问容器 IP?
因为容器 IP 是 Docker 虚拟网桥分配的私有 IP,仅宿主机可直接访问,外部网络无路由

2️⃣ bridge 模式下端口映射的作用是什么?
将宿主机端口与容器端口绑定,使外部能通过宿主机 IP: 端口访问容器服务

场景二:host 模式——高性能服务部署

场景背景(生产化)

公司部署一个高性能 Web 服务/监控服务

  • 对网络性能敏感
  • 不希望端口映射带来额外开销

因此直接让容器使用宿主机网络。


学生任务

任务 2.1:使用 host 网络模式启动 nginx

在这里插入图片描述

任务 2.2:查看网络信息

在这里插入图片描述


验证要求

  • 访问方式:http://宿主机IP:80
  • 不需要 -p 参数
  • 容器内看到的 IP 信息与宿主机一致
    在这里插入图片描述
    在这里插入图片描述

思考题(必答)

1️⃣ host 模式下,容器有没有独立 IP?
容器没有独立 IP,直接使用宿主机的 IP 和端口
2️⃣ host 模式适合什么类型的应用?
适合对网络性能要求高的应用(如高性能 Web 服务、监控服务)
3️⃣ host 模式的安全风险是什么?
容器可直接访问宿主机网络资源,可能泄露宿主机信息


场景三:container 模式——紧密耦合服务(Sidecar)

场景背景(生产化)

某系统由两个组件组成:

  • 主服务(Service)
  • 辅助服务(日志/监控/代理)

要求:

  • 两个容器共享网络
  • 使用 localhost 通信

学生任务

任务 3.1:启动主容器

任务 3.2:查看主容器网络命名空间

任务 3.3:启动共享网络的辅助容器

在这里插入图片描述

任务 3.4:对比两个容器的网络

在这里插入图片描述


验证要求

  • 两个容器 IP 完全一致
  • 网络命名空间相同
  • 可通过 localhost 通信

思考题(必答)

1️⃣ container 模式与 host 模式的区别?
ontainer 模式共享另一个容器的网络,而 host 模式共享宿主机网络
2️⃣ 为什么称这种模式为 Sidecar(边车模式)?
辅助容器像 “边车” 一样依附于主容器,共享网络资源并提供辅助功能(如日志、代理),故称为 Sidecar 模式。

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

场景背景(生产化)

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

  • Web + App + DB
  • 需要:
    • 容器间直连
    • 可指定 IP
    • 网络与其他项目隔离

学生任务

任务 4.1:创建自定义网络

在这里插入图片描述

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

在这里插入图片描述

任务 4.3:容器间通信测试!

在这里插入图片描述


验证要求

  • 自定义网络出现在 docker network ls
  • 容器 IP 为指定值
  • 容器间可直接通信

思考题(必答)

1️⃣ 为什么默认 bridge 不能指定 IP?
Docker 默认 bridge 的 IP 分配由 Docker daemon 自动管理,无手动指定功能。
2️⃣ 自定义网络适合什么场景?
适合多容器组成的复杂系统(如 Web+App+DB),需固定 IP 和网络隔离
3️⃣ Docker 如何实现容器间二层通信?
Docker 通过虚拟网桥(bridge)和 veth pair 实现容器间二层通信,容器接入同一网桥即可直接通信


更多推荐