场景

你是某公司运维/DevOps 实习生。现在需要在一台 Linux 服务器上完成**Web 服务上线、巡检、排障、数据传递、迁移备份、下线清理**等生产常见流程。要求你使用 Docker 完成对应操作并提交证据。

场景 1:上线发布(创建+启动合并,后台运行)

任务 1.1:用 nginx 镜像创建并启动容器(后台运行)

要求:  

* 容器名:`web-prod-01`
* 端口映射:宿主机 `43000` 映射容器 `80`
* 后台运行:必须使用 `-d`

docker ps` 输出(能看到端口映射)

浏览器访问 `http://宿主机IP:43000`

 场景 2:基础操作(创建、启动、停止、查看)

任务 2.1:使用 docker create 创建容器(默认停止)

要求:

* 使用 `docker create -it nginx:latest /bin/bash`(或按你环境可用镜像)
* 证明容器状态是 `Created`
docker ps -a` 输出(状态为 Created)

任务 2.2:启动该容器并查看状态

【小贴士】:

  1. Up 状态:容器主进程持续运行,是正常提供服务的状态,通常由持续性启动命令(如后台服务)导致;
  2. Exited 状态:容器主进程已退出Exit Code 0 多为正常完成一次性任务,非 0 则是异常(如配置错误、资源不足、端口冲突),需通过 docker logs 排查原因。

任务 2.3:停止容器

* `docker stop <容器ID或名称>`
* `docker ps -a` 输出(状态为 Exited)

 场景 3:排障进入容器(容器交互)

任务 3.1:进入 web-prod-01 容器执行命令

* `ls`
* `cat /etc/os-release`

场景 4:文件复制(主机↔容器)

任务 4.1:把宿主机文件复制到容器

要求:

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

过程如下:

* 宿主机:`cat ~/test.txt`
* `docker cp ~/test.txt web-prod-01:/opt/`
* 容器内验证:`cat /opt/test.txt`

任务 4.2:从容器复制回宿主机

要求:

* 从容器复制 `/opt/test.txt` 到宿主机 `~/abc123.txt`

场景 5:容器迁移(导出与导入)

任务 5.1:导出容器为 tar 包

过程如下

`docker export web-prod-01 > web-prod-01.tar`
* `ls -lh web-prod-01.tar`

任务 5.2:导入 tar 包生成新镜像

过程如下:

* `cat web-prod-01.tar | docker import - web-import:test`
* `docker images | grep web-import`

export/import` 和 `save/load` 有什么区别?

  1. save/load 针对镜像(含所有层和元数据),export/import 针对容器(仅导出容器文件系统);
  2. save 可打包多个镜像,export 仅导出单个容器快照;
  3. load 保留镜像完整信息(标签 / 历史),import 会生成无历史的新镜像。

场景 6:下线与清理(删除与批量删除)

任务 6.1:删除指定容器
* `docker stop web-prod-01`
* `docker rm web-prod-01`
* `docker ps -a | grep web-prod-01`

任务 6.2:批量停止所有容器

`docker stop $(docker ps -q)`

任务 6.4:批量删除镜像

docker rmi -f $(docker images -q)`

为什么生产环境不建议直接执行“删除所有容器/镜像”?

1. 不可逆的业务中断,引发生产故障

2. 误删关键资源,破坏系统环境

生产环境建议:① 按需删除(指定容器 ID / 镜像名,而非批量);② 删除前备份数据、确认容器 / 镜像非核心资源;③ 通过容器编排工具(如 Docker Compose、K8s)管理资源,避免手动执行高危删除命令。

Docker 网络模式场景

场景背景(生产化)

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

  - 容器之间相互隔离
  - 对外通过端口映射提供服务
任务 1.1:使用 bridge 模式运行 nginx

任务 1.2:查看容器 IP

任务 1.3:访问服务

  - 浏览器访问:`http://宿主机IP:8080`

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

场景背景(生产化)
  公司部署一个**高性能 Web 服务/监控服务**:
  - 对网络性能敏感
  - 不希望端口映射带来额外开销
  因此直接让容器使用宿主机网络
任务 2.1:使用 host 网络模式启动 nginx


任务 2.2:查看网络信息

1️⃣ host 模式下,容器有没有独立 IP?
没有,host模式下,容器会完全共享宿主机的网络命名空间,容器没有自己的网卡、IP 地址、端口范围,直接使用宿主机的 IP 和端口; 在容器内执行 ifconfig/ip addr,看到的是宿主机的网卡和 IP,而非容器专属的; 容器内的网络操作(比如监听端口),本质就是在宿主机的网络栈上操作。

2️⃣ host 模式适合什么类型的应用?
对网络性能要求极致的应用;需要直接使用宿主机多端口 / 动态端口的应用;测试 / 调试场景

3️⃣ host 模式的安全风险是什么?
host模式的核心风险来自网络隔离性的丧失,端口暴露风险(最核心);权限与网络攻击面扩大;与宿主机进程的冲突风险;跨容器的网络干扰

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

场景背景(生产化)
某系统由两个组件组成:
 - 主服务(Service)
 - 辅助服务(日志/监控/代理)
要求:
- 两个容器**共享网络**
- 使用 `localhost` 通信

 任务 3.1:启动主容器 

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

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

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

验证:两个容器可通过localhost通信

1️⃣ container 模式与 host 模式的区别?
特性container 模式host 模式
网络命名空间归属复用指定容器的网络命名空间复用宿主机的网络命名空间
localhost 指向指向共享的目标容器,同命名空间容器互通指向宿主机,容器与宿主机 localhost 等价
IP / 端口特性与目标容器共用 IP,端口由目标容器管理与宿主机共用 IP,直接占用宿主机端口
隔离性仅与共享容器共享网络,与其他容器 / 宿主机隔离无网络隔离,容器网络行为等价于宿主机进程
适用场景容器间 localhost 通信(如 Sidecar 模式)高性能网络需求、需直接使用宿主机网络资源

2️⃣ 为什么称这种模式为 Sidecar(边车模式)?
Sidecar 模式借鉴边车摩托车的 “主车 + 辅助边车” 架构
  1. 主容器:承担核心业务功能(如 Web 服务);

  2. Sidecar 容器:通过 container 模式共享主容器的网络命名空间,提供辅助功能(如日志收集、监控、流量代理);

  3. 两者独立部署但资源共享,Sidecar 可通过 localhost 无侵入访问主容器服务,不影响主容器核心逻辑,就像边车依附主车提供额外能力。

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


场景背景(生产化)

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

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

任务 4.1:创建自定义网络


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


任务 4.3:容器间通信测试y要求定义网络出现在 `docker network ls`

验证要求
自定义网络出现在 `docker network ls`
容器 IP 为指定值
容器间可直接通信
 
1️⃣ 为什么默认 bridge 不能指定 IP?
核心是 Docker 限制了默认 bridge 的 IPAM 配置,设计目标是极简易用,手动指定易导致冲突和机制破坏;
2️⃣ 自定义网络适合什么场景?
需要固定 IP / 域名解析、多容器隔离、自定义网络参数、容器集群通信的场景;
3️⃣ Docker 如何实现容器间二层通信?
核心是虚拟网桥(软件交换机)+ veth 对(容器和网桥的连接通道),数据包通过网桥基于 MAC 地址转发,macvlan/overlay 可满足特殊二层通信需求。

更多推荐