
Docker 与 Kubernetes从“集装箱”到“远洋舰队”Docker 与 Kubernetes从“集装箱”到“远洋舰队”1. Docker 是什么——把应用装进“集装箱”1.1 Docker 解决了什么问题1.2 核心概念小白版1.3 Docker 的常用命令看一眼就行2. Docker 火了之后新的问题来了3. Kubernetes 是什么——容器的“总司令”3.1 Kubernetes 能做什么3.2 核心概念小白版4. Docker 和 K8s 的关系集装箱 vs 远洋舰队5. 它们是不是非此即彼6. 小白常见疑问Q1我能不能不学 Docker 直接学 K8sQ2Docker 和虚拟机有什么区别Q3K8s 只能管理 Docker 吗Q4学习顺序是什么7. 总结Docker 与 Kubernetes从“集装箱”到“远洋舰队”你有没有遇到过这种情况在电脑上跑得好好的程序换到服务器上就报错开发说“我这边没问题啊”运维说“环境不一样啊”。Docker就是来解决这个问题的。而Kubernetes是 Docker 流行之后用来管理成千上万个 Docker 容器的“总指挥官”。1. Docker 是什么——把应用装进“集装箱”想象一下你是一家工厂的老板要出口一批玩具。传统做法把玩具直接堆在船上。但每个国家的港口要求不同有的要贴标签有的要防潮有的要单独清关。到了港口还要重新打包、搬运——非常折腾。集装箱的做法把玩具提前装进标准化的集装箱里。箱子里自带标签、防潮、固定措施。无论运到哪个国家只要把整个箱子吊到船上就行不用重新打包。Docker 就是软件世界的“集装箱”。1.1 Docker 解决了什么问题传统痛点Docker 的解法“在我电脑上能跑啊”把环境和代码一起打包保证到处运行一致。安装配置依赖很麻烦Java、Python、数据库驱动镜像里什么都装好了一条命令就启动。新服务器部署要配半天拉取镜像启动容器几秒钟搞定。多个应用在同一台服务器上冲突比如一个要 Python2一个要 Python3每个容器隔离互不影响。1.2 核心概念小白版镜像Image一个只读的“模板”就像集装箱的设计图纸。里面装好了操作系统、代码、运行环境。类比一个已经装好所有东西的“种子文件”容器Container镜像的一个运行实例。你可以启动、停止、删除它。类比根据图纸造出来的一个实体集装箱仓库Repository存放镜像的地方。Docker Hub 就是官方仓库你可以从上面拉取别人做好的镜像比如nginx、mysql、python。类比集装箱码头放着成千上万种集装箱1.3 Docker 的常用命令看一眼就行# 拉取镜像dockerpull nginx# 运行容器dockerrun-d-p80:80 nginx# 查看运行中的容器dockerps# 停止容器dockerstop容器ID# 删除容器dockerrm容器ID你不需要记住这些命令只需要知道Docker 把环境和代码打包成一个镜像然后在任何有 Docker 的地方一条命令就能跑起来。2. Docker 火了之后新的问题来了假设你的业务成功了用户量暴涨。一个 Docker 容器不够了你需要启动100 个甚至1000 个容器。这时候问题就来了这 1000 个容器应该放在哪些服务器上某个容器挂了谁来重启它用户请求来了怎么平均分给这 1000 个容器发布新版本怎么做到不停机更新一个一个替换容器越来越多怎么让它们互相发现、通信这些问题的答案Kubernetes简称 K8s。3. Kubernetes 是什么——容器的“总司令”Kubernetes 是一个开源的容器编排平台它可以自动化地管理成百上千个 Docker 容器。名字由来Kubernetes 是希腊语“舵手”的意思缩写 K8sK 和 s 之间有 8 个字母。3.1 Kubernetes 能做什么能力说明自动部署你告诉它“我要跑 10 个 nginx”它负责去找空闲机器创建。弹性伸缩流量大了一键增加容器数量流量小了自动缩容。自动恢复某个容器挂了K8s 自动重启一个新的。负载均衡流量自动分散到所有容器上。滚动更新更新版本时一次只替换一个容器全程不中断服务。服务发现容器之间不用记 IP直接通过服务名互相访问。3.2 核心概念小白版PodK8s 里最小的部署单元。一个 Pod 里通常只有一个容器也可以有多个。类比一个 Pod 就是一个“工人”Deployment管理 Pod 的“经理”负责保证始终有指定数量的 Pod 在运行支持滚动更新、回滚。类比班组长盯着工人不要少Service给一组 Pod 提供一个固定的访问入口无论 Pod 怎么重启、IP 怎么变Service 的地址不变。类比餐厅的固定电话谁接听不重要打这个电话总能找到人Ingress七层路由网关把外部流量比如https://api.example.com导到不同的 Service。类比公司总机你拨分机号能找到不同部门NodeK8s 集群里的一台服务器物理机或虚拟机。Namespace虚拟隔离空间可以把不同环境开发、测试、生产隔开。4. Docker 和 K8s 的关系集装箱 vs 远洋舰队维度DockerKubernetes角色集装箱远洋舰队司令职责打包、运行单个容器调度、管理成千上万个容器处理能力单机跨成百上千台机器自动恢复不支持容器挂了就挂了支持自动重启弹性伸缩手动自动服务发现需要额外组件内置滚动更新不支持支持一句话总结Docker 负责“把应用装进集装箱并在一台机器上跑起来”。Kubernetes 负责“管理一个港口里成千上万个集装箱的调度、装卸、维护”。5. 它们是不是非此即彼不是。它们是互补的、配合使用的。你可以只用 Docker如果你只有一两台服务器跑几个容器手动管理就够了。你也可以用 Kubernetes 管理 Docker 容器K8s 默认使用 Docker 作为容器运行时也支持 containerd、CRI-O 等。在实际生产环境中典型的使用方式是开发人员用 Docker 打包应用制作镜像。镜像上传到仓库如 Docker Hub。运维人员编写 Kubernetes 的 YAML 文件描述需要多少个 Pod、用什么镜像、暴露什么端口。K8s 自动拉取镜像并在集群中启动容器并持续维护状态。类比Docker 集装箱制造公司K8s 全球航运物流系统调度每一艘船、每一个港口、每一个集装箱。6. 小白常见疑问Q1我能不能不学 Docker 直接学 K8s答不建议。K8s 管理的就是容器你得先理解容器是什么、镜像是什么否则 K8s 的概念Pod、Deployment会很抽象。Q2Docker 和虚拟机有什么区别虚拟机虚拟的是整个操作系统包括内核需要 GB 级内存Docker 共享宿主机的内核只隔离进程启动快毫秒级占用 MB 级内存。Q3K8s 只能管理 Docker 吗不是。K8s 通过 CRI容器运行时接口可以对接多种运行时比如 containerd、CRI-O。Docker 只是其中一种。Q4学习顺序是什么先学 Docker安装、拉取镜像、跑容器、制作自己的镜像写 Dockerfile。再学 K8s用 Minikube 或 Docker Desktop 自带的 K8s 跑一个 Deployment Service。深入Ingress、ConfigMap、持久化存储、Helm。7. 总结Docker把应用及其环境打包成容器实现“一次构建到处运行”。解决环境不一致、部署繁琐的问题。Kubernetes当容器数量成百上千时自动编排它们解决调度、伸缩、恢复、服务发现等问题。关系Docker 是“集装箱”K8s 是“远洋舰队”。它们不是对手而是黄金搭档。最后送你一句话Docker 让你把应用装进盒子K8s 让你在几百台服务器上轻松倒腾这些盒子。从一台电脑到万台集群K8s 就是那把打开云原生大门的钥匙。希望这篇博客能帮你理清这两个 buzzword 的关系。如果你想了解如何写第一个 Dockerfile或者在本地跑一个 K8s 示例欢迎留言告诉我