Docker 容器与 Kubernetes 编排指南
一、Docker Desktop 概述
1.1 定义与核心价值
Docker Desktop 是 Docker 官方提供的 Windows/Mac 桌面客户端,提供可视化界面管理容器,简化本地开发和测试流程。
核心价值:
- 可视化管理:图形化界面查看和管理容器、镜像、网络
- 一键部署:快速启动常用服务(MySQL、Redis、Nginx 等)
- 多平台支持:统一的开发体验,支持 Windows、Mac、Linux
- 内置工具:集成 Docker Compose、Kubernetes、Dev Environments
1.2 界面功能
左侧导航栏
| 功能 |
描述 |
| Containers |
查看和管理运行中的容器 |
| Images |
查看和管理本地镜像 |
| Volumes |
管理数据卷 |
| Networks |
管理网络配置 |
| Dev Environments |
开发环境管理 |
| Settings |
配置 Docker 运行参数 |
常用操作
右键容器 → Start/Stop/Restart
右键容器 → Open in Terminal(进入容器)
右键容器 → Inspect(查看详细信息)
右键镜像 → Run(创建容器)
1.3 配置优化
资源配置
打开 Settings → Resources:
- CPU:分配 CPU 核心数(建议 2-4 核)
- Memory:分配内存(建议 4-8GB)
- Disk:分配磁盘空间
- WSL Integration:启用与 WSL 的集成
镜像加速
打开 Settings → Docker Engine,添加镜像源:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
二、Docker 容器引擎深度解析
2.1 Docker 的核心角色
Docker 作为容器引擎,负责:
- 创建和运行单个容器
- 镜像构建、容器运行、单机管理
- 提供容器运行时环境
2.2 工作原理
┌──────────────────────────────────────────────┐
│ Docker Client │
│ (docker 命令行工具、Docker Desktop) │
└───────────────────┬──────────────────────────┘
│ API
▼
┌──────────────────────────────────────────────┐
│ Docker Daemon │
│ (dockerd,运行在宿主机后台) │
└───────────────────┬──────────────────────────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 镜像管理 │ │ 容器管理 │ │ 网络管理 │
└─────────┘ └─────────┘ └─────────┘
2.3 适用场景
| 场景 |
是否适用 Docker |
说明 |
| 本地开发 |
✓ |
快速搭建开发环境 |
| 测试环境 |
✓ |
与生产环境一致 |
| 单个服务器部署 |
✓ |
Docker + Docker Compose |
| CI/CD |
✓ |
构建和测试容器化应用 |
三、Kubernetes 容器编排平台
3.1 定义与核心价值
Kubernetes(简称 K8s) 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。
核心价值:
- 自动化运维:自动部署、扩缩容、自愈恢复
- 高可用性:故障自动转移,服务持续可用
- 弹性伸缩:根据负载自动调整资源
- 服务发现:内置 DNS 服务,容器间自动发现
3.2 核心组件
控制平面组件
| 组件 |
作用 |
| kube-apiserver |
Kubernetes API 服务器,集群控制入口 |
| etcd |
分布式键值存储,存储集群状态 |
| kube-scheduler |
调度器,将 Pod 分配到节点 |
| kube-controller-manager |
控制器管理器,维护期望状态 |
节点组件
| 组件 |
作用 |
| kubelet |
节点代理,管理容器生命周期 |
| kube-proxy |
网络代理,维护网络规则 |
| Container Runtime |
容器运行时(Docker、containerd) |
3.3 核心概念
| 概念 |
定义 |
类比 |
| Pod |
最小部署单元,包含一个或多个容器 |
应用实例 |
| Service |
定义 Pod 的访问方式(ClusterIP、NodePort、LoadBalancer) |
服务入口 |
| Deployment |
声明式管理 Pod 部署,支持滚动更新 |
部署模板 |
| ReplicaSet |
确保指定数量的 Pod 副本运行 |
副本控制器 |
| Namespace |
虚拟集群,隔离资源 |
项目/环境隔离 |
| Volume |
持久化存储 |
共享存储 |
| ConfigMap/Secret |
配置管理 |
配置文件/密钥 |
3.4 工作流程
用户提交 Deployment → API Server → etcd (存储)
↓
Scheduler (调度) → 选择节点
↓
kubelet (执行) → 创建 Pod → 运行容器
↓
kube-proxy (网络) → 创建 Service → 暴露服务
四、Docker 与 Kubernetes 对比
4.1 核心区别
| 维度 |
Docker |
Kubernetes |
| 定位 |
容器引擎 |
容器编排平台 |
| 管理范围 |
单机容器 |
集群容器 |
| 核心功能 |
构建、运行容器 |
部署、扩缩容、自愈 |
| 适用场景 |
开发、测试、单节点部署 |
生产环境、多节点部署 |
| 复杂度 |
简单易用 |
复杂强大 |
4.2 类比理解
类比一:餐厅
Docker → 厨师(负责做一道菜)
Kubernetes → 餐厅经理(协调整个厨房)
厨师(Docker):
- 专注于烹饪(构建和运行容器)
- 擅长单个菜品(单个容器)
经理(Kubernetes):
- 管理多个厨师(多个节点)
- 协调订单处理(调度 Pod)
- 确保菜品质量(健康检查)
- 应对突发情况(故障恢复)
类比二:交通系统
Docker → 汽车发动机(单个容器运行)
Kubernetes → 城市交通调度系统(集群管理)
发动机(Docker):
- 提供动力(运行容器)
- 单个车辆(单个容器)
交通调度(Kubernetes):
- 管理多条道路(多节点)
- 控制车流量(负载均衡)
- 处理交通事故(故障恢复)
- 优化路线(调度算法)
4.3 技术关系
┌─────────────────────────────────────────────┐
│ Kubernetes (编排层) │
│ Deployment / Service / ReplicaSet / ... │
└────────────────────┬────────────────────────┘
│ 调用
▼
┌─────────────────────────────────────────────┐
│ Container Runtime (运行时) │
│ Docker Engine / containerd / CRI-O │
└────────────────────┬────────────────────────┘
│ 创建
▼
┌─────────────────────────────────────────────┐
│ 容器实例 │
│ (运行中的应用进程) │
└─────────────────────────────────────────────┘
重要说明:
- Kubernetes 1.24+ 默认使用 containerd 作为容器运行时
- Docker Engine 仍可使用,但需通过 cri-dockerd 适配
- containerd 是更轻量、更稳定的容器运行时
五、选型决策指南
5.1 场景匹配
| 场景 |
推荐方案 |
理由 |
| 本地开发、测试 |
Docker + Docker Compose |
简单易用,快速搭建 |
| 单个服务器部署 |
Docker + Docker Compose |
轻量,无需 K8s 复杂度 |
| 多服务器部署 |
Kubernetes |
自动化管理,高可用 |
| 需要自动扩缩容 |
Kubernetes |
HPA/VPA 自动伸缩 |
| 需要自愈能力 |
Kubernetes |
自动重启、故障转移 |
| CI/CD 流水线 |
Docker |
标准化构建和测试 |
5.2 迁移路径
阶段 1:Docker Compose 部署
↓
阶段 2:Docker Swarm(可选过渡)
↓
阶段 3:Kubernetes(生产环境)
六、实战:Docker Compose 部署多容器应用
6.1 项目结构
my-app/
├── docker-compose.yml
├── web/
│ ├── Dockerfile
│ ├── app.py
│ └── requirements.txt
└── nginx/
└── nginx.conf
6.2 docker-compose.yml
version: '3.8'
services:
web:
build: ./web
container_name: my-web-app
ports:
- "5000:5000"
environment:
- FLASK_ENV=production
- REDIS_URL=redis://redis:6379
depends_on:
- redis
- db
volumes:
- ./web:/app
- static-files:/app/static
redis:
image: redis:7-alpine
container_name: my-redis
ports:
- "6379:6379"
volumes:
- redis-data:/data
db:
image: postgres:15
container_name: my-postgres
ports:
- "5432:5432"
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
volumes:
- postgres-data:/var/lib/postgresql/data
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- static-files:/var/www/static
depends_on:
- web
volumes:
redis-data:
postgres-data:
static-files:
6.3 启动与验证
# 启动服务
docker-compose up -d
# 查看状态
docker-compose ps
# 查看日志
docker-compose logs -f web
# 停止服务
docker-compose down
# 停止并删除数据卷
docker-compose down -v
七、实战:Kubernetes 入门
7.1 启用 Kubernetes(Docker Desktop)
- 打开 Docker Desktop Settings
- 勾选 "Enable Kubernetes"
- 点击 "Apply & Restart"
7.2 验证安装
# 检查 kubectl 版本
kubectl version
# 查看集群节点
kubectl get nodes
# 输出:NAME STATUS ROLES AGE VERSION
# docker-desktop Ready control-plane,master 1d v1.28.2
# 查看所有资源
kubectl get all
7.3 部署应用
创建 Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
# 创建 Deployment
kubectl apply -f deployment.yaml
# 查看 Deployment
kubectl get deployments
# 查看 Pod
kubectl get pods
创建 Service
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30007
# 创建 Service
kubectl apply -f service.yaml
# 查看 Service
kubectl get services
# 访问服务
curl http://localhost:30007
7.4 常用操作
# 查看 Pod 日志
kubectl logs <pod-name>
# 进入 Pod
kubectl exec -it <pod-name> -- bash
# 查看 Pod 详情
kubectl describe pod <pod-name>
# 扩缩容
kubectl scale deployment nginx-deployment --replicas=5
# 删除资源
kubectl delete deployment nginx-deployment
kubectl delete service nginx-service
八、高级话题
8.1 容器网络模式对比
| 模式 |
特点 |
适用场景 |
| Bridge |
默认模式,容器间可通信 |
单机多容器 |
| Host |
共享宿主机网络 |
高性能网络 |
| None |
无网络连接 |
安全隔离 |
| Overlay |
跨主机网络 |
Swarm/K8s 集群 |
8.2 持久化存储方案
| 方案 |
特点 |
适用场景 |
| Docker Volume |
Docker 管理的数据卷 |
单机部署 |
| Host Path |
挂载宿主机目录 |
开发环境 |
| NFS |
网络文件系统 |
多节点共享 |
| PersistentVolume |
K8s 持久化卷 |
K8s 集群 |
8.3 安全最佳实践
1. 使用非 root 用户运行容器
2. 限制容器资源(CPU、内存)
3. 定期更新镜像
4. 使用私有镜像仓库
5. 配置网络策略隔离
6. 扫描镜像漏洞
九、总结
核心要点
- Docker 是基础:容器引擎,负责构建和运行单个容器
- Kubernetes 是进阶:容器编排平台,管理大规模集群
- 选型看场景:开发测试用 Docker,生产环境用 K8s
- 技术演进:Docker → Docker Compose → Kubernetes
学习路径
Docker 基础 → Docker Compose →
Kubernetes 基础 → K8s 高级特性 →
生产环境部署 → 运维监控
下一步建议
- 实践 Docker Compose 部署完整应用(Web + 数据库 + 缓存)
- 在 Docker Desktop 中启用 Kubernetes,体验集群管理
- 学习 Helm 包管理工具
- 了解 K8s 网络模型和持久化存储