很多初学运维、后端、云原生的同学,始终搞不懂一个问题:Docker 和 K8s 到底是什么关系?为什么部署项目既要用Docker,又要用K8s?能不能只装一个?
网上大部分文章要么全是晦涩概念,要么只有代码没有逻辑,新手看完依旧一头雾水。
本文摒弃晦涩术语,用通俗类比讲透二者核心定位、区别与适配场景,同时附上从零构建镜像 → K8s集群部署 → 服务访问 → 日常运维全套实战教程,全程可直接复刻,适合入门学习、项目落地、面试基础复盘。
一、核心一句话:Docker和K8s不是竞争关系,是「上下游搭档」
先记住这个核心结论,彻底告别认知误区:
Docker 负责「打包应用」,K8s 负责「管理应用」。
用最通俗的生活类比:
-
Docker 是集装箱:把代码、依赖、环境、配置统一打包成标准镜像,保证"在哪跑都一样",解决环境不一致问题;
-
K8s(Kubernetes)是物流调度系统:负责管理成千上万个集装箱,实现自动部署、扩容、故障重启、负载均衡、服务自愈。
二者各司其职、缺一不可:没有Docker,K8s无应用可调度;没有K8s,Docker只能单机裸跑,无法支撑线上业务。
二、深度拆解:Docker、K8s各自核心作用
2.1 Docker:单机容器化打包工具
Docker的核心使命只有一个:标准化应用交付。
传统开发部署最大痛点:本地能跑、测试能跑、线上报错,本质是环境依赖、版本、配置不统一。
Docker通过镜像机制,将程序运行所需的系统环境、依赖库、代码、配置全部封装,实现一次构建,到处运行。
Docker 核心能力:
-
快速打包应用为镜像
-
本地测试、跨环境迁移零适配成本
-
轻量高效,资源占用远低于虚拟机
-
适合单机、小项目、本地开发调试
2.2 K8s:分布式容器编排管理平台
Docker只能管理单台机器的容器,一旦业务扩容、多机器部署、高可用需求出现,Docker就彻底不够用了。
K8s 是谷歌开源的企业级容器编排系统,专门解决大规模容器的运维难题。
K8s 核心能力:
-
自愈能力:容器崩溃、节点故障,自动重启、迁移实例
-
弹性扩容:流量暴涨自动加实例,流量低谷自动缩容,节省资源
-
负载均衡:自动分发流量,避免单实例压力过载
-
滚动更新:升级项目不宕机,灰度发布零故障
-
资源管控:限制每个应用CPU、内存,避免服务抢占资源
三、必懂知识点:2026最新Docker与K8s兼容关系
很多新手听过"K8s弃用Docker",这里统一辟谣,避免被老旧教程误导:
K8s 废弃的是dockershim适配层,并不是废弃Docker镜像!
当前主流工作流程不变:
开发者依旧用Docker打包镜像 → 推送镜像仓库 → K8s通过标准容器接口拉取镜像部署
简单说:打包依旧靠Docker,运行靠容器运行时,调度靠K8s,入门和企业落地流程完全没变。
四、场景选型:什么时候只用Docker?什么时候必须上K8s?
新手不用盲目装K8s,根据业务场景选型,省时省力:
4.1 仅使用Docker的场景(个人/小项目/测试环境)
-
本地开发、环境统一调试
-
单机部署小型项目、个人博客、工具服务
-
测试环境快速部署、临时服务运行
-
无需高可用、无需扩容、流量稳定的业务
4.2 必须使用K8s的场景(企业/线上/微服务)
-
微服务架构,服务数量多、依赖复杂
-
线上生产环境,需要7×24小时高可用
-
业务流量波动大,需要弹性扩缩容
-
需要灰度发布、滚动更新、零宕机升级
-
多服务器集群部署、统一运维管理
五、全套实战教程:Docker打包 + K8s完整部署流程
本章节为核心干货,从零演示完整落地流程,以Nginx为例,新手可直接复制操作。
5.1 整体流程梳理
编写Dockerfile → 构建镜像 → (可选)推送仓库 → 编写K8s配置文件 → 部署应用 → 暴露服务 → 验证访问
5.2 第一步:编写Dockerfile打包应用
新建文件 Dockerfile(无后缀),写入基础配置:
# 基础镜像 FROM nginx:alpine # 自定义页面内容 RUN echo "Docker+K8s 入门部署实战成功!" > /usr/share/nginx/html/index.html # 暴露端口 EXPOSE 80
5.3 第二步:Docker构建本地镜像
在Dockerfile同级目录执行打包命令:
# 构建镜像,命名为test-nginx,版本v1 docker build -t test-nginx:v1 . # 查看本地镜像 docker images
执行成功后,即可得到可被K8s调度的标准镜像。
5.4 第三步:编写K8s部署配置(Deployment)
新建 nginx-deploy.yaml,定义应用部署规则(副本数、镜像、端口、容错策略):
apiVersion: apps/v1 kind: Deployment metadata: name: test-nginx-deploy labels: app: test-nginx spec: replicas: 3 # 启动3个容器副本,保证高可用 selector: matchLabels: app: test-nginx template: metadata: labels: app: test-nginx spec: containers: - name: test-nginx image: test-nginx:v1 # 本地Docker镜像名 ports: - containerPort: 80 resources: limits: cpu: 0.5 memory: 512Mi
5.5 第四步:编写K8s服务暴露配置(Service)
Pod内部端口无法外部访问,新建 nginx-svc.yaml 暴露服务:
apiVersion: v1 kind: Service metadata: name: test-nginx-svc spec: selector: app: test-nginx type: NodePort # 节点端口模式,外部可直接访问 ports: - port: 80 targetPort: 80 nodePort: 30080 # 外部访问端口
5.6 第五步:K8s一键部署应用
# 部署应用 kubectl apply -f nginx-deploy.yaml # 暴露服务 kubectl apply -f nginx-svc.yaml # 查看部署状态 kubectl get deployments # 查看运行的Pod kubectl get pods # 查看服务端口 kubectl get svc
5.7 第六步:验证访问
浏览器访问:服务器IP:30080
页面展示 Docker+K8s 入门部署实战成功! 即部署完成。
六、K8s核心运维常用命令(新手必备)
# 查看所有资源 kubectl get all # 查看Pod详细信息(排查报错) kubectl describe pod pod名称 # 查看容器日志 kubectl logs pod名称 # 动态扩容副本数 kubectl scale deployment test-nginx-deploy --replicas=5 # 删除部署 kubectl delete -f nginx-deploy.yaml kubectl delete -f nginx-svc.yaml
七、常见新手误区避坑
-
误区1 :认为K8s可以替代Docker 纠正:K8s只负责调度,无法打包应用,Docker是容器镜像标准工具,二者互补不可替代
-
误区2 :本地开发直接用K8s 纠正:本地开发、调试优先用Docker,K8s适合线上集群运维,本地用过于笨重
-
误区3 :K8s废弃Docker镜像纠正:仅废弃旧适配层,Docker镜像依旧是K8s最主流的应用交付格式
-
误区4 :所有项目都要多副本纠正:测试项目单副本即可,生产环境根据业务需求配置多副本实现高可用
八、全文总结
-
核心定位:Docker是应用打包工具,解决环境一致性;K8s是容器编排平台,解决大规模集群运维、高可用、弹性扩容问题。
-
协作关系:Docker负责"造镜像",K8s负责"管镜像、跑服务",是云原生标准上下游组合。
-
场景选型:小型单机项目用Docker足矣,线上生产、微服务、高可用场景必须搭配K8s。
-
落地流程:Dockerfile构建镜像 → K8s Deployment部署 → Service暴露服务,是企业通用标准化部署流程。
写在最后
Docker + K8s 是目前云原生、后端、运维、DevOps岗位的必学技术栈。新手入门不用死磕底层原理,先掌握「打包+部署+运维」实战流程,再逐步深入集群架构、高级编排、灰度发布、监控告警等进阶能力,快速实现从入门到落地。