Skip to content

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 myapp

Kubernetes 简介

Kubernetes(K8s)是目前最流行的容器编排平台,功能更强大但也更复杂。

核心概念

概念说明
Pod最小部署单元,包含一个或多个容器
Deployment管理 Pod 的副本和更新
Service为 Pod 提供稳定的网络访问
Namespace资源隔离的逻辑分组
ConfigMap配置管理
Secret敏感信息管理

使用 Docker Desktop 体验 K8s

Docker Desktop 内置了单节点 Kubernetes:

  1. 打开 Docker Desktop → Settings → Kubernetes
  2. 勾选 "Enable Kubernetes"
  3. 点击 "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 web

Kubernetes 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: LoadBalancer
bash
kubectl apply -f deployment.yaml

Docker Swarm vs Kubernetes

特性Docker SwarmKubernetes
学习曲线
安装复杂度简单复杂
功能丰富度基础非常丰富
社区生态较小非常庞大
适用规模中小型大型
与 Docker 集成原生需要额外配置
自动扩展手动支持自动

选择建议

  • Docker Swarm:适合中小团队、快速上手、简单的集群需求
  • Kubernetes:适合大型团队、复杂的微服务架构、需要丰富的生态支持

本章小结

集群管理是容器化应用走向生产的关键一步。Docker Swarm 提供了简单易用的集群方案,而 Kubernetes 则是大规模容器编排的行业标准。根据团队规模和业务需求选择合适的方案。

延伸阅读