Docker实训练习

你是某公司运维/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:把宿主机文件复制到容器

要求:

  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`

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:批量停止所有容器(两种方式任选其一)

任选提交一种:

  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 网络模式场景化

实验说明

  • 实验环境:单台 Linux 主机(物理机/虚拟机均可)

  • 镜像建议:`nginx`、`centos:7`

  • 禁止使用 `--network none`

  • 每个场景**必须执行命令并给出验证结果**

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

场景背景(生产化)

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

  • 容器之间相互隔离

  • 对外通过端口映射提供服务

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

学生任务

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

### 任务 1.2:查看容器 IP

### 任务 1.3:访问服务

验证要求

  • `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)挂载到网桥上,网桥作为二层交换设备,实现容器间的二层(数据链路层)通信。

相关推荐
一叶知秋yyds15 小时前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
斯普信云原生组16 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪16 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人17 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
safestar201217 小时前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins
来一颗砂糖橘18 小时前
负载均衡的多维深度解析
运维·负载均衡
楠奕18 小时前
CentOS7安装GoldenDB单机搭建及常见报错解决方案
linux·运维·服务器
GCTTTTTT18 小时前
远程服务器走本地代理
运维·服务器
剑锋所指,所向披靡!18 小时前
Linux常用指令(2)
linux·运维·服务器
飞Link19 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化