一、CKA 模拟考:王姐的 15 个"为什么"
模拟考试那天,王姐又坐在考官席上。这次她学聪明了,提前准备了问题。
为什么 1:咱们不是有虚拟机了吗,为什么还要用容器?
"虚拟机解决'一台机器只能跑一个系统',但它太重——每个 VM 背一个完整操作系统,启动要分钟级,部署要两小时。容器只隔离应用不隔离内核,几十 MB、秒级启动、环境天然一致。两者互补:底层虚拟化做安全隔离,应用层容器做快速部署。"
为什么 2:镜像和容器到底啥区别?
"镜像是只读的图纸,容器是按图纸盖出来的房子。 一个镜像可以创建无数个容器;镜像不变,容器可写。就像类(镜像)和对象(容器)的关系。"
为什么 3:容器怎么做到"互不干扰"的?
"靠 Linux 内核的两个机制:Namespace(命名空间)让容器互相'看不见'——每个容器有自己的进程、网络、文件系统视图;Cgroup(控制组)让容器'抢不过'——限制每个容器的 CPU、内存上限。"
为什么 4:Dockerfile 是干什么的?和手动装环境有啥区别?
"Dockerfile 是镜像的'配方',把装环境的所有步骤写成代码。手动装环境 = 每台机器各装各的(容易不一致);Dockerfile = 环境即代码——写一次,处处用,还能版本管理。核心指令:FROM/WORKDIR/COPY/RUN/EXPOSE/CMD。"
为什么 5:容器里的数据,删容器就没了?
"对!容器文件系统是临时的。 所以数据要放数据卷(Volume)——Docker 管理的持久化存储。容器随便删、随便换,数据卷是'传家宝'。开发时用绑定挂载(改代码即生效),生产用数据卷,临时缓存用 tmpfs。"
为什么 6:容器之间怎么互相访问?
"把容器放进同一个自定义网络,直接用容器名访问——Docker 内置 DNS 把名字解析成 IP。外部访问用端口映射 -p 宿主机端口:容器端口。注意:只有需要对外的容器才映射端口,数据库、缓存这些内部服务绝不暴露。"
为什么 7:部署 5 个容器要敲 20 条命令,太累怎么办?
"用 docker-compose——把整个系统的部署配置写成一个 yaml 文件(services/volumes/networks),一条 docker compose up -d 全家桶全部拉起。部署逻辑变成代码,可版本管理、可复现、可交接。但 compose 只能管单台机器。"
为什么 8:镜像从哪来?随便拉一个靠谱吗?
"从镜像仓库(Registry)来——公共的用 Docker Hub 拉基础镜像,业务的推到自建私有仓库(Harbor)。镜像安全很重要:只拉可信来源、用 trivy 扫描漏洞、镜像里不用 root 运行。生产部署用具体版本号 tag,不用 latest(方便回滚)。"
为什么 9:docker-compose 管不了多台服务器怎么办?
"上 Kubernetes(K8s)——跨机器的容器编排平台。K8s 是'声明式'的:你告诉它'要 3 个 web 容器',它保证任何时候都有 3 个,多了杀、少了补。核心对象:Pod(最小单位)、Deployment(管副本/滚动更新/回滚)、Service(稳定入口)。"
为什么 10:双十一流量暴涨,难道要半夜爬起来加服务器?
"不用!HPA(弹性伸缩)自动干这活——监控 CPU/内存指标,流量涨了自动从 3 个 Pod 扩到 20 个,流量降了自动缩回去。K8s 是'自动档',人只负责设置上限。"
为什么 11:代码改了,怎么自动变成新版本上线?
"靠 CI/CD 流水线——提交代码(打 tag)自动触发:自动测试 → 自动构建镜像 → 自动推送到 Harbor → 自动部署到 K8s。发布从'手动 40 分钟'变成'自动 10 分钟',坏代码在测试阶段就被拦住,还能一键回滚。"
为什么 12:容器被人打穿了怎么办?听说很危险?
"所以要默认拒绝 + 最小权限:镜像用可信来源+扫描漏洞、容器用非 root 运行、禁止 --privileged、资源限制、端口最小暴露、密钥用 Secret 管理、日志集中监控。容器方便是好事,但'图快不设防'就是给攻击者开门。"
为什么 13:那么多微服务,互相调用出问题怎么查?
"用服务网格(Service Mesh)管流量治理(熔断/限流/重试),用可观测性三件套——指标(Prometheus)、日志(Loki/ELK)、链路追踪(Jaeger)——一次请求走了哪几个服务、哪一步慢,一目了然。云原生系统必须'看得见'。"
为什么 14:Docker、K8s、云原生,到底是什么关系?
"Docker 是打包(容器化)、K8s 是编排(调度)、云原生是整套理念:容器化 + 编排 + 微服务 + DevOps,让应用'为云而生'——更快响应、更稳服务、更省资源。Docker 和 K8s 是工具,云原生是方向。"
为什么 15:最后一个——容器到底解决了什么本质问题?
小陈站起来,指着白板上的家族树说:"容器解决的,是'应用和它的环境'的标准化问题。以前'在我电脑上能跑'是个魔咒——换台机器就翻车。容器把应用+依赖打包成标准镜像,走到哪都长一样;再配上游编排(K8s)和自动化(CI/CD),部署、扩容、自愈全变成机器的事。一句话:容器让软件真正实现了'一次打包,到处运行'。"
王姐带头鼓掌。老周在后排点头:"这小子,出师了。"
二、完整对照表:麻烦 → 容器概念
| 你遇到的麻烦 | 对应的容器概念 | 云间书店的落地 |
|---|---|---|
| 虚拟机太重、部署太慢 | 容器(根) | 从 VM 2 小时 → 容器秒级 |
| 环境不一致,"我电脑能跑" | 镜像 + Dockerfile | 环境即代码,处处一致 |
| 不知道容器怎么隔离的 | Namespace + Cgroup | 看不见别人 + 抢不过别人 |
| 容器数据一删就没了 | 数据卷 Volume | 数据库数据挂卷,容器随便换 |
| 容器之间怎么通信 | 自定义网络 + 端口映射 | 容器名互访,只暴露对外服务 |
| 5 个容器 20 条命令 | docker-compose | 一个 yaml,一条命令全家桶 |
| 镜像从哪来、靠不靠谱 | 镜像仓库 + 扫描 | Harbor 私有仓库 + trivy 扫描 |
| 多台服务器谁调度 | Kubernetes | Pod/Deployment/Service 编排 |
| 流量暴涨要半夜加机器 | HPA 弹性伸缩 | CPU 超 60% 自动扩到 20 个 Pod |
| 发布靠人肉、慢且易错 | CI/CD 流水线 | 打 tag 全自动:测试→构建→部署 |
| 容器被攻破、主机遭殃 | 容器安全 | 非 root + 禁 privileged + 扫描 |
| 微服务多了排障难 | 可观测性 | 指标+日志+链路追踪三件套 |
三、最后一课:容器的"北极星"
考完试,老周和小陈坐在机房外的台阶上,一人一瓶汽水。
"师傅,我学了这么多容器的东西,总觉得它们都指向同一个东西。"小陈说,"但我说不太清是什么。"
"你说说看,你感觉指向什么?"
小陈想了想:"标准化。 镜像标准化了'运行环境',Dockerfile 标准化了'构建过程',compose 标准化了'部署方式',CI/CD 标准化了'发布流程',K8s 标准化了'运行和调度'……每个概念都在干同一件事:把'靠人记、靠人做、靠人祈祷'的事,变成'机器能复制的标准'。"
老周笑了:"你说到根上了。容器世界的所有概念,都是在回答同一个问题:怎么让软件交付这件复杂的事,变得像'贴标签'一样标准化。"
他递给小陈一张纸,上面是那棵家族树,最下面多了一行字:
容器的本质,是把"应用 + 环境"标准化成"可搬运的箱子"——让软件像集装箱一样:一次打包,到处运行。 越往上,越从"管一个容器",走向"管一群容器的自动化"——从打包,到编排,到整个云原生生态。
"记住这句话。"老周说,"然后去把 AI 荐书服务容器化吧——你说过要让它享受自动扩容的。说到做到。"
机房里传来小圆的声音:"小陈!Harbor 装好了!你的镜像仓库可以用了!"
小陈站起来,朝机房跑去,回头喊:"师傅!晚上我请你喝汽水!"
"你请?"老周笑着摇头,"王姐说了,CKA 过了她请大餐。快去,把那个 Dockerfile 写好——别又把依赖写在代码后面。"
全系列完。