Docker 场景化作业:生产环境容器操作实训

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

文章目录

  • 前言
  • 一、作业目标
  • 二、任务清单(按场景完成)
    • [场景 1:上线发布(创建+启动合并,后台运行)](#场景 1:上线发布(创建+启动合并,后台运行))
      • [任务 1.1:用 nginx 镜像创建并启动容器(后台运行)](#任务 1.1:用 nginx 镜像创建并启动容器(后台运行))
    • [场景 2:基础操作(创建、启动、停止、查看)](#场景 2:基础操作(创建、启动、停止、查看))
    • [任务 2.1:使用 docker create 创建容器(默认停止)](#任务 2.1:使用 docker create 创建容器(默认停止))
      • [任务 2.2:启动该容器并查看状态](#任务 2.2:启动该容器并查看状态)
      • [任务 2.3:停止容器](#任务 2.3:停止容器)
    • [场景 3:排障进入容器(容器交互)](#场景 3:排障进入容器(容器交互))
      • [任务 3.1:进入 web-prod-01 容器执行命令](#任务 3.1:进入 web-prod-01 容器执行命令)
    • [场景 4:文件复制(主机↔容器)](#场景 4:文件复制(主机↔容器))
      • [任务 4.1:把宿主机文件复制到容器](#任务 4.1:把宿主机文件复制到容器)
      • [任务 4.2:从容器复制回宿主机](#任务 4.2:从容器复制回宿主机)
    • [场景 5:容器迁移(导出与导入)](#场景 5:容器迁移(导出与导入))
      • [任务 5.1:导出容器为 tar 包](#任务 5.1:导出容器为 tar 包)
      • [任务 5.2:导入 tar 包生成新镜像](#任务 5.2:导入 tar 包生成新镜像)
      • [`export/import` 和 `save/load` 有什么区别?](#export/importsave/load 有什么区别?)
    • [场景 6:下线与清理(删除与批量删除)](#场景 6:下线与清理(删除与批量删除))
      • [任务 6.1:删除指定容器](#任务 6.1:删除指定容器)
      • [任务 6.2:批量停止所有容器(两种方式任选其一)](#任务 6.2:批量停止所有容器(两种方式任选其一))
      • [任务 6.3:删除所有容器](#任务 6.3:删除所有容器)
      • [任务 6.4:批量删除镜像(两种方式任选其一)](#任务 6.4:批量删除镜像(两种方式任选其一))
  • 三、网络部分
    • [Docker 网络模式场景化作业](#Docker 网络模式场景化作业)
    • [场景一:bridge 模式(默认模式)------Web 服务对外发布](#场景一:bridge 模式(默认模式)——Web 服务对外发布)
      • [任务 1.1:使用 bridge 模式运行 nginx](#任务 1.1:使用 bridge 模式运行 nginx)
      • [1️⃣ 为什么外部不能直接访问容器 IP?](#1️⃣ 为什么外部不能直接访问容器 IP?)
      • [2️⃣ bridge 模式下端口映射的作用是什么?](#2️⃣ bridge 模式下端口映射的作用是什么?)
    • [场景二:host 模式------高性能服务部署](#场景二:host 模式——高性能服务部署)
      • [任务 2.1:使用 host 网络模式启动 nginx](#任务 2.1:使用 host 网络模式启动 nginx)
      • [1️⃣ host 模式下,容器有没有独立 IP?](#1️⃣ host 模式下,容器有没有独立 IP?)
      • [2️⃣ host 模式适合什么类型的应用?](#2️⃣ host 模式适合什么类型的应用?)
      • [3️⃣ host 模式的安全风险是什么](#3️⃣ host 模式的安全风险是什么)
    • [场景三:container 模式------紧密耦合服务(Sidecar)](#场景三:container 模式——紧密耦合服务(Sidecar))
      • [任务 3.1:启动主容器](#任务 3.1:启动主容器)
    • [场景四:自定义 bridge 网络------多容器系统与固定 IP](#场景四:自定义 bridge 网络——多容器系统与固定 IP)
      • [任务 4.1:创建自定义网络 任务](#任务 4.1:创建自定义网络 任务)
      • [1.为什么默认 bridge 不能指定 IP?](#1.为什么默认 bridge 不能指定 IP?)
      • [2. 自定义网络适合什么场景?](#2. 自定义网络适合什么场景?)
      • [3.Docker 如何实现容器间二层通信?](#3.Docker 如何实现容器间二层通信?)
  • [总结本质是用 Linux 虚拟网桥模拟二层交换机,用 veth pair 模拟网线,将多个容器的网络命名空间接入同一网桥,从而实现与物理网络一致的二层通信(基于 MAC 地址转发);](#总结本质是用 Linux 虚拟网桥模拟二层交换机,用 veth pair 模拟网线,将多个容器的网络命名空间接入同一网桥,从而实现与物理网络一致的二层通信(基于 MAC 地址转发);)

前言

`

你是某公司运维/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 输出)
bash 复制代码
# 启动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:对比两个容器的网络

bash 复制代码
# 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 后台运行容器(守护态),容器启动后不会占用当前终端

bash 复制代码
# 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:容器间通信测试

bash 复制代码
# 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
bash 复制代码
# 管理 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`)

批量删除命令只允许实验环境,不要在生产机乱用

相关推荐
遇见火星13 小时前
Linux 命令篇:df、du、fdisk 磁盘管理
linux·运维·服务器·df·du·fdisk
噎住佩奇13 小时前
正则表达式(Regex)入门
运维·正则表达式
运维行者_14 小时前
远程办公场景 NFA:从网络嗅探与局域网流量监控软件排查团队网络卡顿问题
运维·服务器·开发语言·网络·自动化·php
❀͜͡傀儡师14 小时前
docker部署Apache Answer 一款高效问答平台
docker·容器·apache
成为你的宁宁14 小时前
【Zabbix运维监控实战(附图文教程):Nginx 服务可用性、连接请求状态、CPU 内存占用与 JVM(Jar 包 / Tomcat)全维度监控】
运维·jvm·nginx·zabbix
gaize121314 小时前
个人建站服务器完全指南:从基础认知到实操选型
运维·服务器
咕噜企业分发小米14 小时前
新人如何利用好云服务器
运维·服务器
q***441514 小时前
Xshell高效运维实战技术文章大纲基础配置与优化
运维
宇钶宇夕14 小时前
CoDeSys入门实战一起学习(五):CoDeSys V3 车库门控制编程全解析系列(手册基础第四篇)
运维·自动化
C_心欲无痕14 小时前
Docker 核心概念和安装
运维·docker·容器