一、先理解一个核心:容器是什么
容器本质就是:
把程序 + 运行环境一起打包,然后在任何机器上运行。
例如一个 Java 服务:
SpringBoot
JDK
依赖库
配置
打包成一个 镜像(image):
my-service:1.0
然后运行:
docker run my-service
就变成一个 容器(container)。
二、Docker 是干什么的
Docker 是 容器运行时(Container Runtime)。
作用:
-
下载镜像
-
创建容器
-
启动容器
-
停止容器
-
删除容器
例如:
docker pull redis
docker run redis
或者运行 Java:
docker run -p 8080:8080 my-springboot
Docker解决的问题是:
开发环境一致
部署简单
依赖隔离
Docker 管理的粒度
Docker 管理的是:
一个容器
例如:
mysql
redis
springboot
nginx
每个都是独立容器。
三、Docker Compose 是什么
Docker Compose 是 多容器编排工具。
解决的问题:
一个项目往往有 多个容器。
例如一个系统:
nginx
springboot
redis
mysql
minio
如果用 docker 手动启动:
docker run mysql
docker run redis
docker run minio
docker run springboot
docker run nginx
非常麻烦。
Compose 的作用
用一个文件:
docker-compose.yml
描述所有服务。
例如:
version: "3"
services:
mysql:
image: mysql:8
ports:
- "3306:3306"
redis:
image: redis
ports:
- "6379:6379"
backend:
image: my-backend
ports:
- "8080:8080"
然后一条命令:
docker compose up
全部启动。
Compose 管理的粒度
Compose 管理的是:
一台服务器上的多个容器
例如:
服务器 A
├ mysql
├ redis
├ backend
└ nginx
四、Kubernetes 是什么
Kubernetes(简称 K8s)是:
容器集群管理平台。
它解决的问题是:
很多服务器
很多容器
自动管理
为什么需要 K8s
如果系统变大:
100 个服务
500 个容器
10 台服务器
Docker Compose 就不够用了。
因为:
-
只能管理 一台机器
-
不会自动扩容
-
不会自动恢复
-
不会负载均衡
Kubernetes 做什么
K8s 可以:
1 自动调度容器
你只说:
我要运行 3 个 backend
K8s 自动决定:
服务器A:1个
服务器B:1个
服务器C:1个
2 自动重启
如果容器挂了:
backend 崩了
K8s:
自动重启
3 自动扩容
流量大时:
backend × 3
自动扩:
backend × 10
4 负载均衡
用户请求:
/api/login
K8s 会自动分配到:
backend-1
backend-2
backend-3
5 滚动发布
升级版本:
v1 → v2
K8s 会:
逐个替换容器
不停机
五、三者关系
最简单理解:
Docker = 容器运行
Compose = 单机编排
Kubernetes = 集群编排
结构是:
Kubernetes
↓
Docker
↓
容器
六、一个真实系统部署例子
例如你的系统:
gateway
auth-center
admin-be
redis
mysql
minio
mqtt
小项目
用:
Docker Compose
一台服务器:
server1
├ gateway
├ auth-center
├ admin-be
├ redis
├ mysql
└ minio
大项目
用:
Kubernetes
多台服务器:
server1
├ gateway
├ admin-be
server2
├ auth-center
├ redis
server3
├ mysql
├ minio
K8s 自动管理。
七、一个更形象的比喻
| 工具 | 类比 |
|---|---|
| Docker | 一辆车 |
| Compose | 一个车队 |
| Kubernetes | 交通调度中心 |
八、为什么大厂都用 K8s
因为它解决:
高可用
自动扩容
滚动发布
故障恢复
服务发现
负载均衡
所以现在:
云原生 = Kubernetes
一句话总结
Docker 负责"运行容器"
Compose 负责"在一台机器上管理多个容器"
Kubernetes 负责"在很多机器上管理很多容器"