
Docker 与容器(八):超越 Docker —— Kubernetes、Swarm 及未来演进
单机版 Docker 在规模化时必然失效。本文预览容器编排技术——Docker Swarm 以简洁见长,Kubernetes 则覆盖一切需求,并勾勒更广阔的云原生生态全景。
本系列此前的内容均围绕单机版 Docker展开,即仅在一台机器上运行容器。这种方式非常适合开发、小型项目以及流量适中的应用。然而,一旦你需要服务在服务器宕机时仍能存活、应对突发流量高峰,或实现零停机部署更新,单机版 Docker 就显得力不从心了。而**容器编排(Container Orchestration)**正是为解决这些问题而生,其中 Kubernetes 已成为事实上的行业标准。
为何单机版 Docker 不够用?#
设想一下,如果 Docker 主机意外宕机会发生什么:

| 问题 | 单机版 Docker | 启用编排后 |
|---|---|---|
| 服务器崩溃 | 所有容器终止,需手动重启 | 容器自动重新调度至健康节点 |
| 流量激增 | 手动执行 --scale 扩容 | 基于指标的自动扩缩容 |
| 部署更新 | docker compose down && up(必然停机) | 滚动更新(Rolling Update),零停机 |
| 服务发现 | 自定义网络 DNS(仅限单机) | 全集群 DNS + 负载均衡 |
| 密钥轮换 | 重启容器并注入新环境变量 | 滚动式密钥轮换,无需重启容器 |
| 资源分配 | 依赖人工估算内存是否充足 | 调度器智能放置容器,优化资源利用 |
| 监控 | docker stats(仅限单机) | 全集群指标采集与告警 |
| 存储 | 本地卷(主机宕机即丢失数据) | 支持复制的持久化卷(Persistent Volumes) |
这些问题属于运维层面,而非 Docker 本身的问题。Docker 完美地完成了其设计任务——在单台主机上运行容器;而编排器则在此基础上增加了跨多主机协同调度的关键能力。
Docker Swarm:通往编排的极简路径#
Docker Swarm 是 Docker 内置的编排方案。如果你已经熟悉 docker compose,那么你实际上已经掌握了 Swarm 的八成。它使用相同的 YAML 格式和高度相似的命令。

初始化 Swarm 集群#
| |
| |
| |
| |
| |
| |
仅需四条命令即可建立一个三节点集群,这正是 Swarm 的核心吸引力。
部署服务(Services)#
Swarm 引入了“服务(Service)”的概念,即对容器运行方式进行声明式定义,并负责维持指定数量的副本(replicas)。
| |
| |
| |
| |
Swarm 将三个副本均匀分布于全部三个节点。它还提供内置负载均衡:集群中任意节点均可通过端口 80 接收流量,Swarm 会自动将请求路由至运行该服务的容器。
滚动更新(Rolling Updates)#
| |
| |
Swarm 每次仅更新一个容器,并在每次更新之间等待 10 秒;若新容器健康检查失败,则会自动回滚。
部署 Stack(在 Swarm 中运行 Compose 文件)#
你可以直接将 docker-compose.yml 文件部署到 Swarm:
| |
| |
| |
| |
Swarm 的 Secrets 与 Configs#
Swarm 原生支持密钥(Secrets)和配置文件(Configs):
| |
在容器内部,密钥以文件形式挂载在 /run/secrets/ 目录下:
| |
Swarm 的适用场景#
当满足以下任一条件时,Swarm 是一个合理的选择:
- 团队规模小(少于 5 名工程师)
- 集群规模小(少于 10 个节点)
- 希望获得编排能力,但不愿承担 Kubernetes 的陡峭学习曲线
- 已在使用 Docker Compose,希望平滑迁移
- 无需自动扩缩容、自定义调度器或 CNCF 生态体系
Kubernetes:行业标准编排平台#

Kubernetes(K8s)是当前占据主导地位的容器编排平台。虽然比 Swarm 更复杂,但功能也强大得多。主流云厂商均提供托管 Kubernetes 服务(如 EKS、GKE、AKS、ACK),从而免除了用户自行管理控制平面(Control Plane)的运维负担。

架构概览#
Kubernetes 集群包含两类节点:
控制平面(Control Plane,即 master)组件:
| 组件 | 角色 |
|---|---|
kube-apiserver | 所有组件与用户交互的 REST API 入口 |
etcd | 分布式键值存储,保存整个集群的状态 |
kube-scheduler | 决定新 Pod 应调度到哪个工作节点 |
kube-controller-manager | 运行各类控制器(Deployment、ReplicaSet、Node 等) |
cloud-controller-manager | 与云厂商 API 集成(可选) |
工作节点(Worker Node)组件:
| 组件 | 角色 |
|---|---|
kubelet | 节点代理,负责管理本节点上的 Pod,并与 API Server 通信 |
kube-proxy | 网络代理,实现 Service 的流量路由 |
| 容器运行时(Container Runtime) | 运行容器(如 containerd、CRI-O —— 不再依赖 Docker daemon) |
其架构逻辑如下(文字描述,非图示):
| |
Kubernetes 核心对象#
Kubernetes 中的一切皆为声明式对象(Declarative Object):你描述期望的状态(desired state),Kubernetes 则持续努力使其变为现实。
Pod#
最小的可部署单元。一个 Pod 包含一个或多个共享网络与存储的容器:

| |
你极少会直接创建 Pod;通常使用更高层级的对象(如 Deployment)来间接管理。
Deployment#
Deployment 管理一组完全相同的 Pod,并负责处理滚动更新:

| |
| |
| |
| |
| |
| |
Service#
Service 为一组 Pod 提供稳定的访问端点(DNS 名称与 IP 地址):
| |
Service 类型对比:
| 类型 | 可访问性 | 典型用例 |
|---|---|---|
ClusterIP | 仅集群内部可访问 | 微服务间内部调用 |
NodePort | 通过 <NodeIP>:<NodePort> 外部访问 | 开发测试、简单暴露 |
LoadBalancer | 通过云厂商负载均衡器外部访问 | 生产环境 Web 服务 |
ExternalName | DNS CNAME 指向外部服务 | 访问外部数据库等 |
ConfigMap 与 Secret#
| |
在 Pod 中引用它们:
| |
必备 kubectl 命令速查#
| |
Kubernetes vs Docker Swarm 对比#
| 特性 | Docker Swarm | Kubernetes |
|---|---|---|
| 部署复杂度 | 分钟级 | 小时级(托管服务大幅简化) |
| 学习曲线 | 低(Docker CLI 知识可复用) | 陡峭(新概念多,YAML 配置繁重) |
| 扩缩容 | 手动(docker service scale) | 手动 + Horizontal Pod Autoscaler(HPA) |
| 滚动更新 | 内置,简单易用 | 内置,高度可配置 |
| 服务发现 | Docker 内置 DNS | CoreDNS + Service |
| 负载均衡 | 内置(Routing Mesh) | Service + Ingress Controllers |
| 密钥管理 | Docker Secrets | Kubernetes Secrets(+ 外部集成) |
| 存储 | Docker Volumes | PersistentVolumes + StorageClasses + CSI Drivers |
| 网络 | Overlay Networks | CNI 插件(Calico、Cilium、Flannel 等) |
| 健康检查 | HEALTHCHECK 指令 | Liveness / Readiness / Startup Probes |
| 包管理 | 无 | Helm Charts |
| 社区与生态 | 小,呈萎缩趋势 | 庞大,CNCF 生态繁荣 |
| 可托管服务 | 极少 | EKS、GKE、AKS、ACK 等众多选择 |
| 最佳适用场景 | 小团队、简单部署 | 大规模生产、微服务架构 |
何时你 不需要 编排?#
并非所有应用都需要 Kubernetes。请诚实地评估自身需求:
| 你的现状 | 推荐方案 |
|---|---|
| 单台服务器,服务极少 | Docker Compose |
| 小团队,少于 5 个服务 | Docker Compose 或 Swarm |
| 单机上需零停机部署 | Docker Compose(配合滚动重启策略) |
| 无服务器(Serverless)工作负载 | 云函数(Lambda、Cloud Run) |
| 批处理任务 | Docker Compose 或单机调度器 |
| 多地域、高可用要求 | Kubernetes(托管版) |
| 微服务架构 | Kubernetes |
| 合规性强制要求编排 | Kubernetes |
| 工程师团队超过 10 人 | Kubernetes |
一个常见误区是:为一个仅运行在每月 20 美元 VPS 上的三服务应用仓促引入 Kubernetes。即使采用托管服务,Kubernetes 带来的运维开销也远超其收益——除非你已达到一定规模。
如果你仍在单台主机上运行,但希望获得更优的部署体验,不妨考虑以下工具:
- Docker Compose + 简单 CI/CD 流水线
- Kamal(Basecamp 出品)——面向裸金属服务器的零停机部署工具
- Dokku——自托管 PaaS(类似私有 Heroku)
- Coolify——开源、可自托管的 Heroku/Netlify/Vercel 替代方案
云原生(Cloud-Native)生态系统#

Kubernetes 催生了一个庞大的工具生态。以下是其中最重要的一些:
包管理:Helm#
Helm 是 Kubernetes 的包管理器。“Chart” 将一个应用所需的所有 YAML 文件打包封装:
| |
Helm Charts 就像 Docker Images 的升级版——它是整个应用栈的预打包、版本化、可共享单元。
服务网格(Service Mesh):Istio 与 Linkerd#
服务网格为微服务间通信增加可观测性、安全性和流量管理能力:
| 特性 | 无服务网格 | 启用服务网格 |
|---|---|---|
| 服务间 mTLS | 手动证书管理 | 自动、透明启用 |
| 流量拆分 | 应用层实现 | 声明式(如 80/20 灰度发布) |
| 重试策略 | 每个服务自行编码 | 按路由粒度可配置 |
| 可观测性 | 各服务需自行埋点 | 自动分布式追踪与指标采集 |
| 访问控制 | 应用层鉴权 | 基于策略(YAML)的统一管控 |
Istio 功能丰富但复杂;Linkerd 更轻量、更简单。二者均非必需——除非你拥有 10 个以上相互调用的微服务,且对流量控制有精细化要求。
GitOps:ArgoCD 与 Flux#
GitOps 将 Git 仓库视为集群状态的唯一可信源(Source of Truth):
- 你向 Git 提交变更(例如更新 Deployment YAML 中的镜像 tag)
- ArgoCD 检测到变更,并自动同步集群状态以匹配 Git
- 集群最终收敛至你所声明的期望状态
| |
优势:
- 每次变更均可审计(Git 历史记录)
- 回滚 =
git revert - 生产环境无需手动执行
kubectl apply - 集群状态始终可通过 Git 100% 重建
监控与可观测性(Monitoring & Observability)#
| 工具 | 用途 | 采集内容 |
|---|---|---|
| Prometheus | 指标采集与告警 | CPU、内存、请求速率、自定义业务指标 |
| Grafana | 可视化与仪表盘 | 展示 Prometheus 数据(及其他数据源) |
| Jaeger / Zipkin | 分布式追踪 | 请求在微服务间的完整调用链路 |
| Fluentd / Fluent Bit | 日志聚合 | 容器日志 → 中央存储系统 |
| Elasticsearch + Kibana | 日志存储与搜索 | 全文可检索的日志索引 |
Kubernetes 社区公认的开源可观测性“黄金栈”是:Prometheus + Grafana + Fluentd(或 Fluent Bit)+ Jaeger,当然也存在诸多替代方案。
Kubernetes 中的容器安全#
| 工具 | 用途 |
|---|---|
| Trivy | 镜像漏洞扫描 |
| Falco | 运行时安全监控(检测异常容器行为) |
| OPA/Gatekeeper | 策略强制执行(例如:“禁止容器以 root 用户运行”) |
| cert-manager | 自动 TLS 证书管理(对接 Let’s Encrypt) |
| Kyverno | Kubernetes 原生策略引擎 |
从 Docker 到生产环境:典型演进路径#
一个团队从个人项目成长为生产级服务,其基础设施与部署方式的演进路径通常如下:
| 阶段 | 基础设施 | 部署方式 |
|---|---|---|
| 1. 本地开发 | 笔记本上的 Docker Compose | docker compose up |
| 2. 单服务器部署 | VPS 上的 Docker Compose | git pull && docker compose up -d |
| 3. CI/CD 流水线 | Docker Compose + GitHub Actions | 向 main 分支推送即自动部署 |
| 4. 多服务器部署 | Docker Swarm 或托管 Kubernetes | docker stack deploy 或 kubectl apply |
| 5. 大规模生产 | 托管 Kubernetes(EKS/GKE/AKS/ACK) | Helm + ArgoCD |
| 6. 多地域部署 | 托管 Kubernetes + 服务网格 | GitOps + 流量管理 |
大多数团队永远无需走到第 5 或第 6 阶段。不要因为“听起来很酷”就跃升至第 5 阶段——只有当当前阶段遇到的实际问题,其复杂度已明确超出当前工具的能力边界时,才应迈出这一步。
本系列核心要点回顾#
回望全部八篇文章,以下原则最为根本:
容器本质是进程,而非虚拟机。 它们共享宿主机内核,依靠命名空间(namespaces)与控制组(cgroups)实现隔离。理解这一点,将从根本上塑造你对安全性、性能及调试的认知。
镜像是分层结构: 分层缓存驱动构建性能;Dockerfile 指令顺序至关重要;多阶段构建(multi-stage build)可清晰分离构建期依赖与运行时依赖。
网络与卷是连接的纽带: 自定义桥接网络提供基于 DNS 的服务发现;命名卷(named volumes)使数据持久化独立于容器生命周期。
Compose 是开发者的接口。 一份 YAML 文件即可替代数十条 docker run 命令。它可版本控制、可共享、可确定性复现。
安全是“显式开启”的选项: Docker 默认优先考虑便利性。以非 root 用户运行、裁剪 Linux Capabilities、使用只读文件系统、扫描镜像漏洞——这些都必须由你主动、明确地配置。
编排是一个光谱(spectrum)。 Docker Compose 适用于单机,Swarm 适用于简单多机,Kubernetes 适用于大规模生产。选择能解决你当下真实问题的最简单工具。
容器生态虽日新月异,但本系列所阐述的基础原理却极为稳固:Linux 命名空间自 2013 年起未变;OCI 镜像格式早已标准化;Kubernetes API 对象多年保持稳定。掌握这些根基,你便能从容驾驭其上构建的所有新兴工具。
Docker 与容器化 8 篇
- 01 Docker 与容器(一):为何需要容器——虚拟机未能解决的问题
- 02 Docker 与容器(二):镜像与分层——`docker pull` 到底下载了什么?
- 03 Docker 与容器(三):Dockerfile 最佳实践 —— 从初学者到生产环境
- 04 Docker 与容器(四):网络与卷——容器如何通信与持久化数据
- 05 Docker 与容器(五):Docker Compose——多容器应用
- 06 Docker 与容器(六):调试与日志——当‘盒子’内部出问题时
- 07 Docker 与容器(七):安全——运行容器时不必交出全部权限
- 08 Docker 与容器(八):超越 Docker —— Kubernetes、Swarm 及未来演进 当前