提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

`
你是某公司运维/DevOps 实习生。现在需要在一台 Linux 服务器上完成Web 服务上线、巡检、排障、数据传递、迁移备份、下线清理等生产常见流程。要求你使用 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 输出)
# 启动Nginx容器,指定宿主机43000端口→容器80端口
docker run -d --name web-prod-01 -p 43000:80 nginx

# 查看端口映射结果
docker ps -a

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


场景 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 进程退出 → 容器退出

容器启动后,会将用户指定的命令(如 /bin/bash)作为容器内的 PID=1 进程(主进程),Docker 守护进程会持续监控这个 PID=1 进程的状态 ——只要 PID=1 进程退出,Docker 就判定容器生命周期结束,立即将容器状态置为 Exited。


在这里插入图片描述

docker ps -a结果解读:

CONTAINER ID:容器唯一ID
NAME:容器名称
STATUS:容器状态(Up运行中,Exited已停止,Paused暂停)
PORTS:端口映射(如0.0.0.0:8080->80/tcp表示宿主机8080端口映射到容器80端口)

场景 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 句话以内)

save/load 针对镜像,保留分层和历史记录,export/import 针对容器,仅导出文件系统快照;
import 生成的镜像无分层历史,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 网络模式(除 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 ◦或命令:

在这里插入图片描述

1️⃣ 为什么外部不能直接访问容器 IP?

容器 IP 是宿主机内网私有 IP,外部网络无路由可达 + 网络隔离机制限制:

2️⃣ bridge 模式下端口映射的作用是什么?

是打通外部网络到容器的通信链路,解决容器 IP 无法被外部访问的问题

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

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

2.2:查看网络信息络模式启动 nginx

验证方式:

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

1️⃣ host 模式下,容器有没有独立 IP?

没有,和宿主机共享ip

2️⃣ host 模式适合什么类型的应用?

追求极致网络性能、需直接使用宿主机端口 / 网络环境

3️⃣ host 模式的安全风险是什么

host 模式的安全风险根源是「网络无隔离」,容器相当于直接 “暴露” 在宿主机网络中,一旦容器被入侵或存在恶意程序,会直接威胁宿主机及内网环境的安全,权限边界远弱于 bridge 模式。

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

场景背景(生产化)

某系统由两个组件组成:
◦ 主服务(Service)
◦ 辅助服务(日志/监控/代理)
要求:
◦ 两个容器共享网络 ◦ 使用 localhost 通信

任务 3.1:启动主容器

任务 3.2:查看主容器网络命名空间
任务 3.3:启动共享网络的辅助容器 h3
任务 3.4:对比两个容器的网络

# 1. 先创建基础容器test1-container(CentOS 7)
docker run -itd --name test1-container centos:7 /bin/bash

# 2. 查看test1-container的进程号(用于后续验证网络命名空间)
docker inspect -f '{{.State.Pid}}' test1-container  # 输出示例:11117

# 3. 查看test1-container的网络命名空间(记录net对应的编号,如4026532575)
ls -l /proc/11117/ns
# 输出示例:
# lrwxrwxrwx 1 root root 0 1月   7 11:27 net -> net:[4026532504]

在这里插入图片描述

-i 保持标准输入(stdin)打开,支持交互(即使后台运行)
-t 为容器分配伪终端(tty),模拟命令行交互环境
-d 后台运行容器(守护态),容器启动后不会占用当前终端

# 4. 创建test2-container,指定与test1-container共享网络
docker run -itd --name test2-container --net=container:test1-container centos:7 /bin/bash

# 5. 验证网络命名空间共享(test2-container的net编号与test1-container一致)
docker inspect -f '{{.State.Pid}}' test2-container  # 输出示例:11402
ls -l /proc/11402/ns
# 输出示例:
# lrwxrwxrwx 1 root root 0 1月   7 12:27 net -> net:[4026532504]

在这里插入图片描述
验证要求

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

1️⃣ container 模式与 host 模式的区别?
container 模式是 “容器共享容器的网络”,host 模式是 “容器共享宿主机的网络”;前者隔离性介于 bridge 和 host 之间,后者完全无网络隔离。

2️⃣ 为什么称这种模式为 Sidecar(边车模式)?

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

公司部署一个多服务系统:
Web + App + DB
需要:

  • 容器间直连
  • 可指定 IP
  • 网络与其他项目隔离

任务 4.1:创建自定义网络 任务

4.2:在自定义网络中启动容器 h3
任务 4.3:容器间通信测试

# 1. 创建自定义bridge网络(子网172.18.0.0/16,网卡名docker1)
docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
# 参数说明:
# --subnet:指定网络子网;
# --opt "com.docker.network.bridge.name":指定宿主机上的网卡名(默认是br-xxx格式,不易记);
# mynetwork:自定义网络名称。

# 2. 启动容器时指定自定义网络和IP
docker run -itd --name test4 --net mynetwork --ip 172.18.0.10 centos:7 /bin/bash

# 3. 验证IP(进入容器查看)
docker exec -it test4 ip addr  # 应显示172.18.0.10
docker inspect test4

在这里插入图片描述

# 管理 Linux 桥接网络
brctl show
# 管理 Docker 容器网络
docker network ls

在这里插入图片描述

1.为什么默认 bridge 不能指定 IP?

默认 bridge 网络设计上不支持直接指定静态 IP,根源是其 IP 管理(IPAM)策略和功能定位的限制
设计定位:默认 bridge 追求 “极简易用”,而非灵活配置
底层机制:默认 bridge 缺少 “静态 IP 分配” 的必要配置

2. 自定义网络适合什么场景?

自定义网络适合需静态 IP、容器名解析、多环境 / 业务隔离、适配企业网络策略的生产场景,是默认 bridge 网络的 “进阶版”,也是 Docker 生产部署的主流选择

3.Docker 如何实现容器间二层通信?

总结本质是用 Linux 虚拟网桥模拟二层交换机,用 veth pair 模拟网线,将多个容器的网络命名空间接入同一网桥,从而实现与物理网络一致的二层通信(基于 MAC 地址转发);

常见错误提
docker run -it centos:7 bash 退出 bash → 容器会停(PID=1 结束) docker exec 只能进入运行中容器,先 docker start
docker rm只能删已停止容器(运行中要先 stop 或用-f`)
批量删除命令只允许实验环境,不要在生产机乱用

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐