Docker 集群管理
本章将介绍 Docker 集群管理技术,包括 Docker Swarm 和 Kubernetes 的基本概念与使用方法。
为什么需要集群管理?
单机 Docker 在生产环境中面临的挑战:
| 问题 | 说明 |
|---|---|
| 单点故障 | 一台服务器宕机,所有服务不可用 |
| 资源瓶颈 | 单机资源有限,无法水平扩展 |
| 负载均衡 | 无法自动分配流量 |
| 服务发现 | 多节点间服务通信困难 |
集群管理工具解决了这些问题,实现多节点的容器编排和管理。
Docker Swarm
Docker Swarm 是 Docker 内置的集群管理和编排工具,使用简单,与 Docker CLI 无缝集成。
Swarm 架构
┌─────────────────────────────────────────────┐
│ Docker Swarm 集群 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Manager │ │ Manager │ │ Manager │ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ ┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐ │
│ │ Worker │ │ Worker │ │ Worker │ │
│ │ Node 1 │ │ Node 2 │ │ Node 3 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────┘初始化 Swarm
bash
# 在 Manager 节点上初始化
docker swarm init --advertise-addr <MANAGER-IP>
# 输出会包含加入命令,在 Worker 节点上执行
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
# 查看集群节点
docker node ls部署服务
bash
# 创建服务
docker service create \
--name web \
--replicas 3 \
-p 80:80 \
nginx:latest
# 查看服务
docker service ls
# 查看服务详情
docker service ps web
# 扩展服务
docker service scale web=5
# 更新服务镜像(滚动更新)
docker service update --image nginx:1.25 web
# 删除服务
docker service rm web滚动更新配置
bash
docker service update \
--update-parallelism 2 \
--update-delay 10s \
--update-failure-action rollback \
web使用 Stack 部署
yaml
# docker-stack.yml
version: '3.8'
services:
web:
image: nginx:latest
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
ports:
- "80:80"
api:
image: myapp/api:latest
deploy:
replicas: 2
environment:
- DB_HOST=db
db:
image: postgres:16
deploy:
placement:
constraints:
- node.role == manager
volumes:
- db-data:/var/lib/postgresql/data
volumes:
db-data:bash
# 部署 Stack
docker stack deploy -c docker-stack.yml myapp
# 查看 Stack
docker stack ls
docker stack services myapp
# 删除 Stack
docker stack rm myappKubernetes 简介
Kubernetes(K8s)是目前最流行的容器编排平台,功能更强大但也更复杂。
核心概念
| 概念 | 说明 |
|---|---|
| Pod | 最小部署单元,包含一个或多个容器 |
| Deployment | 管理 Pod 的副本和更新 |
| Service | 为 Pod 提供稳定的网络访问 |
| Namespace | 资源隔离的逻辑分组 |
| ConfigMap | 配置管理 |
| Secret | 敏感信息管理 |
使用 Docker Desktop 体验 K8s
Docker Desktop 内置了单节点 Kubernetes:
- 打开 Docker Desktop → Settings → Kubernetes
- 勾选 "Enable Kubernetes"
- 点击 "Apply & Restart"
bash
# 验证 Kubernetes
kubectl cluster-info
kubectl get nodes基本操作
bash
# 部署应用
kubectl create deployment web --image=nginx --replicas=3
# 暴露服务
kubectl expose deployment web --port=80 --type=NodePort
# 查看资源
kubectl get pods
kubectl get services
kubectl get deployments
# 扩展
kubectl scale deployment web --replicas=5
# 更新镜像
kubectl set image deployment/web nginx=nginx:1.25
# 查看日志
kubectl logs <pod-name>
# 删除资源
kubectl delete deployment web
kubectl delete service webKubernetes YAML 配置
yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: LoadBalancerbash
kubectl apply -f deployment.yamlDocker Swarm vs Kubernetes
| 特性 | Docker Swarm | Kubernetes |
|---|---|---|
| 学习曲线 | 低 | 高 |
| 安装复杂度 | 简单 | 复杂 |
| 功能丰富度 | 基础 | 非常丰富 |
| 社区生态 | 较小 | 非常庞大 |
| 适用规模 | 中小型 | 大型 |
| 与 Docker 集成 | 原生 | 需要额外配置 |
| 自动扩展 | 手动 | 支持自动 |
选择建议
- Docker Swarm:适合中小团队、快速上手、简单的集群需求
- Kubernetes:适合大型团队、复杂的微服务架构、需要丰富的生态支持
本章小结
集群管理是容器化应用走向生产的关键一步。Docker Swarm 提供了简单易用的集群方案,而 Kubernetes 则是大规模容器编排的行业标准。根据团队规模和业务需求选择合适的方案。