Docker 入门:容器化如何改变软件交付,以及它和 Kubernetes 到底有什么区别

发布时间:2026/8/4 9:33:02
Docker 入门:容器化如何改变软件交付,以及它和 Kubernetes 到底有什么区别
Docker 入门容器化如何改变软件交付以及它和 Kubernetes 到底有什么区别一句话版本Docker 负责把一个应用打包并跑起来Kubernetes 负责把成百上千个这样的应用管好。两者不是竞争关系而是上下游的互补关系。一、Docker 是什么Docker 是一个开源的容器化平台它把应用及其所有依赖代码、运行时、系统库、配置文件打包成一个标准化的单元——容器镜像Image。这个镜像在任何安装了 Docker 的机器上都能以完全相同的方式运行。容器 vs 虚拟机很多人第一次接触容器时会拿它和虚拟机对比虚拟机VM容器Container虚拟化层级虚拟化硬件每个 VM 带一个完整 Guest OS虚拟化操作系统共享宿主机内核启动速度分钟级秒级甚至毫秒级体积GB 级MB 级隔离性强独立内核进程级隔离namespace cgroup资源开销高低容器本质上是 Linux 内核提供的两种机制的组合Namespace命名空间让进程看不见别人——隔离 PID、网络、文件系统视图等Cgroups控制组限制进程能用多少——CPU、内存、I/O 配额。Docker 的核心概念概念说明Image镜像只读模板包含运行应用所需的一切Container容器镜像的运行实例相当于跑起来的进程Dockerfile构建镜像的脚本描述镜像怎么一层层搭出来Registry仓库镜像的分发存储中心如 Docker Hub、HarborVolume卷容器外的持久化存储容器删了数据还在Network网络容器间互通的虚拟网络一个最小例子# Dockerfile FROM golang:1.25 AS builder WORKDIR /app COPY go.mod go.sum ./ RUN go mod download COPY . . RUN CGO_ENABLED0 go build -o server ./cmd FROM alpine:3.20 COPY --frombuilder /app/server /usr/local/bin/server EXPOSE 8080 CMD [server]构建并运行dockerbuild-tmyapp:1.0.dockerrun-d-p8080:8080--namemyapp myapp:1.0三条命令一个应用就在任何机器上一致地跑起来了。这就是 Docker 解决的核心问题在我机器上是好的这句话从此消失。Docker Compose单机多容器的粘合剂当一个应用由多个服务组成Web 数据库 缓存时可以用docker-compose.yml在单台机器上编排它们services:web:build:.ports:[8080:8080]depends_on:[db,redis]db:image:postgres:16volumes:[pgdata:/var/lib/postgresql/data]redis:image:redis:7volumes:pgdata:dockercompose up-d注意这里的边界Compose 管理的是一台机器上的多个容器。一旦跨越多台机器就轮到 Kubernetes 出场了。二、Kubernetes 是什么Kubernetes简称 K8s因为 K 和 s 之间有 8 个字母是 Google 开源的容器编排平台。它管理的是一个机器集群回答的是生产环境里真正棘手的问题应用要跑在哪台机器上调度容器挂了怎么办自愈自动重启、重新调度流量涨了怎么扩容水平伸缩HPA 根据 CPU/内存/自定义指标自动加减副本用户访问哪个容器服务发现与负载均衡Service / Ingress怎么安全地发新版本滚动更新 / 回滚Deployment 渐进式替换旧 PodK8s 的核心抽象概念说明Pod最小调度单元包含一个或多个共享网络的容器Deployment声明我要 N 个某应用的副本K8s 负责维持Service稳定的访问入口为一组 Pod 做负载均衡Namespace集群内的逻辑隔离空间Node集群中的一台工作机器上面那个docker run的应用在 K8s 里长这样apiVersion:apps/v1kind:Deploymentmetadata:name:myappspec:replicas:3# 始终保持 3 个副本selector:matchLabels:{app:myapp}template:metadata:labels:{app:myapp}spec:containers:-name:myappimage:myapp:1.0ports:[{containerPort:8080}]你声明期望状态3 个副本K8s 的控制器循环不断地把实际状态往期望状态上纠正——挂一个就补一个机器宕机就把容器迁到别的机器。这是 K8s 与 Docker 在设计哲学上的根本差异。三、重点Docker 与 Kubernetes 的区别这是本文的核心。先上对比表再逐条展开。3.1 对比总表维度DockerKubernetes定位容器化平台 / 容器运行时工具容器编排平台解决的问题怎么打包、分发、运行一个应用怎么在集群里管理成百上千个容器管理范围单台主机多节点集群最小单元Container容器Pod可含多个容器描述方式docker run命令 / Compose 文件声明式 YAMLDeployment/Service 等扩缩容docker compose scale单机、手动HPA 自动水平伸缩、跨节点调度故障处理容器挂了默认就挂了--restart仅本机重启自愈自动重启、跨节点重新调度服务发现容器名 DNS仅限单机网络Service DNS集群级稳定入口发布策略手动 stop 旧容器、run 新容器滚动更新、金丝雀、一键回滚抽象层级面向单个容器的生命周期面向应用期望状态的持续调谐学习曲线平缓几小时上手陡峭概念体系庞大3.2 逐条解读① 定位不同工具 vs 平台Docker 是一把趁手的扳手——打包镜像、启动容器、查看日志作用于单个容器的生命周期。Kubernetes 是整个车间的调度系统——它不关心某一个容器本身关心的是这批容器作为一个整体是否始终处于我声明的状态。② 命令式 vs 声明式用 Docker 时你是命令式的“docker run给我跑一个”。容器死了除非加了 restart 策略否则没人管。用 K8s 时你是声明式的“我要 3 个副本、每个 512Mi 内存、对外暴露 8080”。之后由 K8s 的控制器持续调谐reconcile loop任何偏离期望状态的情况都会被自动纠正。这是运维模式上的质变从我执行操作变成我描述目标。③ 自愈能力的差距Docker 的--restartalways只能在同一台机器上重启容器。如果这台机器本身宕机了呢Docker 没有答案。K8s 的健康检查liveness/readiness probe 调度器会处理整条故障链容器崩溃→重启进程假死→探针失败→杀掉重建节点失联→把上面的 Pod 迁移到健康节点。故障被当作常态来处理这是分布式系统的核心思想。④ 伸缩的维度不同Docker Compose 的scale受限于单机资源一台机器的 CPU 和内存就是天花板。K8s 的伸缩有两个维度Pod 层面HPA 自动增减副本和节点层面Cluster Autoscaler 自动增减机器流量洪峰来时整个集群横向铺开。⑤ 最常见的误区“K8s 取代了 Docker”没有。这个误解源于 2020 年 Kubernetes 宣布弃用 dockershim、并在 1.24 版本中移除了对 Docker Engine 的直接支持。真相是K8s 通过CRI容器运行时接口调用底层运行时现在默认用containerd或CRI-O——它们比完整的 Docker Engine 更轻量但你用 Docker 构建的镜像完全不受影响。Docker 镜像遵循 OCI开放容器镜像标准containerd 照样能跑Docker 内部本来用的也是 containerd——K8s 只是跳过 Docker 这层中间商直接和它对话。所以正确的图景是Docker构建/分发镜像 ──产出── OCI 标准镜像 ──运行于── Kubernetes 集群 底层运行时 containerd/CRI-ODocker 和 K8s 是流水线的两端而不是二选一的竞品。3.3 怎么选场景推荐本地开发、CI 构建镜像Docker单机部署的小项目 / 个人服务Docker Compose多节点、需要高可用的生产服务Kubernetes需要自动伸缩、滚动发布、多团队协作Kubernetes刚起步、团队没有专职运维Docker Compose 起步规模上来后再迁 K8s一个务实的路线用 Docker 构建镜像用 Compose 跑本地和小规模部署当手动管容器开始消耗你太多精力时再上 Kubernetes。不要为了用 K8s 而用 K8s——它解决的是规模化问题引入的复杂度同样可观很多团队用 Compose 或单机 Swarm 就足够把业务跑得很好。四、总结Docker让应用一次构建处处运行是容器化时代的基石它的战场是单个容器的打包与运行。Kubernetes在容器之上提供调度、自愈、伸缩、服务发现和发布管理它的战场是整个集群的期望状态。两者是互补关系Docker或任何 OCI 工具链生产镜像Kubernetes 消费并管理这些镜像。技术选型的关键不是哪个更先进而是我的规模和问题复杂度到了哪一层。容器化已经是现代软件交付的默认姿势。理解了 Docker 与 K8s 各自解决的问题边界你就不会被云原生焦虑裹挟能在正确的层次用正确的工具。