Docker 与 Kubernetes:从"集装箱"到"远洋舰队"
- [Docker 与 Kubernetes:从"集装箱"到"远洋舰队"](#Docker 与 Kubernetes:从“集装箱”到“远洋舰队”)
-
- [1. Docker 是什么?------把应用装进"集装箱"](#1. Docker 是什么?——把应用装进“集装箱”)
-
- [1.1 Docker 解决了什么问题?](#1.1 Docker 解决了什么问题?)
- [1.2 核心概念(小白版)](#1.2 核心概念(小白版))
- [1.3 Docker 的常用命令(看一眼就行)](#1.3 Docker 的常用命令(看一眼就行))
- [2. Docker 火了之后,新的问题来了](#2. Docker 火了之后,新的问题来了)
- [3. Kubernetes 是什么?------容器的"总司令"](#3. Kubernetes 是什么?——容器的“总司令”)
-
- [3.1 Kubernetes 能做什么?](#3.1 Kubernetes 能做什么?)
- [3.2 核心概念(小白版)](#3.2 核心概念(小白版))
- [4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队](#4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队)
- [5. 它们是不是非此即彼?](#5. 它们是不是非此即彼?)
- [6. 小白常见疑问](#6. 小白常见疑问)
-
- [Q1:我能不能不学 Docker 直接学 K8s?](#Q1:我能不能不学 Docker 直接学 K8s?)
- [Q2:Docker 和虚拟机有什么区别?](#Q2:Docker 和虚拟机有什么区别?)
- [Q3:K8s 只能管理 Docker 吗?](#Q3:K8s 只能管理 Docker 吗?)
- Q4:学习顺序是什么?
- [7. 总结](#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 的常用命令(看一眼就行)
bash
# 拉取镜像
docker pull nginx
# 运行容器
docker run -d -p 80:80 nginx
# 查看运行中的容器
docker ps
# 停止容器
docker stop <容器ID>
# 删除容器
docker rm <容器ID>
你不需要记住这些命令,只需要知道:Docker 把环境和代码打包成一个镜像,然后在任何有 Docker 的地方,一条命令就能跑起来。
2. Docker 火了之后,新的问题来了
假设你的业务成功了,用户量暴涨。一个 Docker 容器不够了,你需要启动 100 个 甚至 1000 个 容器。
这时候问题就来了:
- 这 1000 个容器应该放在哪些服务器上?
- 某个容器挂了,谁来重启它?
- 用户请求来了,怎么平均分给这 1000 个容器?
- 发布新版本,怎么做到不停机更新(一个一个替换)?
- 容器越来越多,怎么让它们互相发现、通信?
这些问题的答案:Kubernetes(简称 K8s)。
3. Kubernetes 是什么?------容器的"总司令"
Kubernetes 是一个开源的容器编排平台,它可以自动化地管理成百上千个 Docker 容器。
名字由来:Kubernetes 是希腊语"舵手"的意思,缩写 K8s(K 和 s 之间有 8 个字母)。
3.1 Kubernetes 能做什么?
| 能力 | 说明 |
|---|---|
| 自动部署 | 你告诉它"我要跑 10 个 nginx",它负责去找空闲机器创建。 |
| 弹性伸缩 | 流量大了,一键增加容器数量;流量小了,自动缩容。 |
| 自动恢复 | 某个容器挂了,K8s 自动重启一个新的。 |
| 负载均衡 | 流量自动分散到所有容器上。 |
| 滚动更新 | 更新版本时,一次只替换一个容器,全程不中断服务。 |
| 服务发现 | 容器之间不用记 IP,直接通过服务名互相访问。 |
3.2 核心概念(小白版)
-
Pod :K8s 里最小的部署单元。一个 Pod 里通常只有一个容器(也可以有多个)。
(类比:一个 Pod 就是一个"工人")
-
Deployment :管理 Pod 的"经理",负责保证始终有指定数量的 Pod 在运行,支持滚动更新、回滚。
(类比:班组长,盯着工人不要少)
-
Service :给一组 Pod 提供一个固定的访问入口,无论 Pod 怎么重启、IP 怎么变,Service 的地址不变。
(类比:餐厅的固定电话,谁接听不重要,打这个电话总能找到人)
-
Ingress :七层路由网关,把外部流量(比如
https://api.example.com)导到不同的 Service。(类比:公司总机,你拨分机号能找到不同部门)
-
Node:K8s 集群里的一台服务器(物理机或虚拟机)。
-
Namespace:虚拟隔离空间,可以把不同环境(开发、测试、生产)隔开。
4. Docker 和 K8s 的关系:集装箱 vs 远洋舰队
| 维度 | Docker | Kubernetes |
|---|---|---|
| 角色 | 集装箱 | 远洋舰队司令 |
| 职责 | 打包、运行单个容器 | 调度、管理成千上万个容器 |
| 处理能力 | 单机 | 跨成百上千台机器 |
| 自动恢复 | 不支持(容器挂了就挂了) | 支持(自动重启) |
| 弹性伸缩 | 手动 | 自动 |
| 服务发现 | 需要额外组件 | 内置 |
| 滚动更新 | 不支持 | 支持 |
一句话总结 :
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)会很抽象。
Q2:Docker 和虚拟机有什么区别?
虚拟机虚拟的是整个操作系统(包括内核),需要 GB 级内存;
Docker 共享宿主机的内核,只隔离进程,启动快(毫秒级),占用 MB 级内存。
Q3:K8s 只能管理 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 示例,欢迎留言告诉我~