docker和K8S,以及现代企业追求K8S的完美闭环的过程
先说结论:
简单来说,俩个都不能少啊,dockers的优势在于他能制造镜像,dockerfile不可少的,K8S是管理调度这些pod容器的,他需要拉去镜像才能去启动容器,而镜像需要docker,docker打包之后传到镜像仓库,K8S在拉取,这样才能闭环。
云原生应用的生命周期闭环:
流程是一个自动化、标准化的完美闭环,也是现代DevOps和云原生的核心工作流程。
1.开发与封装(docker舞台)
角色:开发者
工具:docker,dockerfile
动作:开发编写应用代码和不可或缺的dockerfile,dockerfile是构建镜像的蓝图,定义了环境和依赖以及运行方式。
另外,执行docker build 命令。docker 引擎读取dockerfile,生成一个轻量级、可移植、自包含的镜像,这个镜像的所有后续环节的基石交付物。
优势体现:环境一致性,隔离性,便携性," 一次构建,处处运行"。
2.存储与分发(镜像仓库的桥梁作用)
角色:CD/CD流程或开发者
工具:镜像仓库(harbor,docker Hub,AWS ECR,Google Container Registry等)
动作:使用docker push 命令将本地构建好的镜像上传到镜像仓库,目的就是为了提供一个集中存储和版本管理的地方用来存放镜像,让K8S集群能够随时拉取。
3.编排和调度(K8S的舞台)
角色:运维/DevOps工程师,K8S工程师
工具:Kubernetes
动作:首先,需要写一个YAML配置文件,定义pod(K8S最小的调度单元)、Deployment(策略)或者StatefulSet(有状态应用)等资源对象。在这个配置中最关键的是它指定的要从哪个镜像仓库去拉去哪个镜像。
其次,使用kubectl apply -f file.yaml 讲配置交给K8S API Server。K8S的调度器(Scheduler)会根据配置,决定在哪个节点(Node)工作启动pod.
最后,就是该节点上的Kubelet(代理)通过运行时(containerd或CRI-O)来创建并启动容器,这个容器运行时就是真正干“ 运行容器 ”的工作,而docker本身也会包含一个运行时(tunc)
这个流程其实也是K8S的整个工作流程,从配置文件到最后的容器运行管理。
优势:自动化部署,服务发现,负载均衡,自愈能力,水平扩缩容。管理成千上百的容器生命周期
4.监控和保障(监控系统的职责)
工具:Promethus,Grafana,Loki,ELK等
动作:监控所有的K8S管理的容器、POD以及节点自身的健康状况、性能指标和日志,确保闭环的稳定运行,出现故障报警,及时处理,对业务增加保障。
关于“K8S 需要 Docker”:这个说法在早期完全正确。但现在需要一点更精确的理解。
* K8S 需要的是一个**容器运行时**来真正启动容器。
* **Docker** 是一个完整的平台,它**包含**了容器运行时、镜像构建工具、CLI 等。
* 在现代 K8S 版本中,为了更轻量和标准化,K8S 通过 **CRI** 接口与容器运行时交互。
* 目前,**containerd**(Docker 底层的运行时)或 **CRI-O** 是更主流的 K8S 容器运行时选择。但是并不唯一。
制造镜像不只有docker,还有其他的工具。
| 工具 | 是否依赖 dockerd | 适用场景 |
|---|---|---|
| Docker | ✔ 依赖 | 开发机、CI 最方便 |
| buildah | ❌ 不依赖 | 云原生 CI、RedHat 系 |
| kaniko | ❌ 不依赖 | 在 K8s 集群里直接构建,无需特权容器 |
| img、buildkit | ❌ 不依赖 | 轻量级、并发构建 |
它们都输出 OCI 标准镜像,所以 K8s 照样能拉。
因此:Docker 是“最常用”的打包工具,但不是“唯一”
-
K8s 只认 OCI 镜像格式,不认你是谁造的。
-
dockerd 被 K8s 淘汰的是“运行时”,不是“镜像格式”也不是 “Dockerfile”。
-
你完全可以在 CI 里用 kaniko 把 Dockerfile 编译成镜像,然后 K8s 拉起——整条链 0 dockerd。
总结:
-
Dockerfile 是云原生世界的“Makefile”——谁来 build 都行。
-
Docker 是最顺手的 build 工具——但只是工具之一。
-
K8s 是镜像的最终消费者——只要仓库里有合法 OCI 镜像,它就闭环保活
更多推荐



所有评论(0)