Docker 与 K8s 关系
Docker 和 Kubernetes 是容器生态两大核心,下面梳理其关系。
Docker 镜像与 Pod
镜像关系
YAML
Docker 镜像
↓
K8s Pod (1 或多个容器)
↓
每个容器 = Docker 镜像的运行实例
Bash
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: my-app:v1.0 # Docker 镜像
- name: sidecar
image: fluentd:latest # Docker 镜像
容器运行时演进
历史演进
YAML
Docker Engine (2013-2016)
↓
containerd (2017)
↓
CRI-O (2017)
↓
containerd (2021,K8s 默认)
Docker Shim 废弃
text
K8s v1.20 废弃 Docker Shim
K8s v1.24 移除 Docker Shim
原因:
- Docker 不遵循 CRI (Container Runtime Interface)
- 需要额外 shim 层转换
- containerd 原生支持 CRI
当前架构
text
K8s
↓ CRI
containerd / CRI-O
↓ OCI
runc
↓
容器
运行时对比
| 运行时 | 维护者 | CRI 支持 | 推荐度 |
|---|---|---|---|
| containerd | CNCF | ✅ 原生 | ✅ 推荐 |
| CRI-O | RedHat | ✅ 原生 | ✅ 推荐 |
| Docker Shim | Docker | ❌ 需转换 | ⚠️ 废弃 |
Docker 镜像兼容性
text
# K8s 可直接使用 Docker 构建的镜像
# 因为都遵循 OCI Image Spec
# 构建镜像
docker build -t my-app:v1.0 .
# K8s 使用
kubectl run my-pod --image=my-app:v1.0
开发到生产流程
text
本地开发:
docker build → docker compose up
构建 CI:
docker build → docker push
部署生产:
kubectl apply -f deployment.yaml
# K8s 从仓库拉取 Docker 构建的镜像
迁移考虑
Docker Compose → K8s
text
# Compose 配置
services:
app:
image: my-app
ports:
- "80:80"
# K8s 等价配置
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
image: my-app
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
spec:
type: LoadBalancer
ports:
- port: 80
要点总结
- Docker 镜像遵循 OCI 规范,K8s Pod 直接使用
- K8s v1.24 移除 Docker Shim,使用 containerd/CRI-O
- 容器运行时架构:K8s → CRI → containerd → OCI → runc
- Docker 构建的镜像可在 K8s 直接使用(OCI 兼容)
- 开发用 Docker Compose,生产用 K8s 编排
📝 发现内容有误?点击此处直接编辑