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

相关推荐
EasyCVR2 小时前
视频汇聚平台EasyCVR筑牢消防领域可视化监控防线
运维·人工智能·音视频
爱宇阳2 小时前
在 Docker 环境中为 GitLab 实例配置邮件服务器
java·docker·gitlab
企鹅侠客2 小时前
探索Kubernetes的ServiceAccounts
云原生·容器·kubernetes
Hello.Reader3 小时前
Flink Materialized Table 完整部署与运维指南:架构、SQL Gateway、Catalog Store、调度刷新一站式落地
运维·架构·flink
Ancelin安心3 小时前
关于代理的一些网络知识复盘
linux·运维·网络·计算机网络·web安全·ubuntu·网络安全
程序边界3 小时前
10年Oracle运维转战国产数据库:迁移路上的“坑”与“光”
运维·数据库·oracle
chenyuhao20243 小时前
Linux系统编程:多线程互斥以及死锁问题
linux·运维·服务器·c++·后端
星星泡饭2923 小时前
从工时消耗到自动化闭环:THERMOMARK E 系列如何定义 2025 工业标识新标准
运维·自动化·菲尼克斯
鱼月半3 小时前
ARM64(华为S9006C,飞腾)银河麒麟离线安装docker及jitsi-meet方案
docker·arm64·银河麒麟·jitsi-meet