【docker基础】第十一周:容器编排基础

📚前言

👀回顾,系统学习docker系列已发布内容:

【docker基础】0、系统学习docker之总计划

【docker基础】第一课、从零开始理解容器技术

【docker基础】第二课:安装、配置与基础命令

【docker基础】第三课:镜像管理与Dockerfile基础

【docker基础】第四课:容器操作与数据管理

【docker基础】第五课:Docker网络详解-CSDN博客

【docker基础】第六课:Web应用与数据库容器部署-CSDN博客

【docker基础】 第七课:Docker Compose 多容器实战-CSDN博客

【docker基础】 第八周:容器监控与应用更新策略-CSDN博客

【docker基础】第九周:Docker安全与镜像优化-CSDN博客

【docker基础】Docker第十周:CI/CD集成-CSDN博客

🔗相关文档:

windows下安装docker

【docker基础】Ubuntu 安装 Docker 超详细小白教程

📒本课学习目标:

  1. 容器编排基础:为什么需要编排
  2. Docker Swarm:初始化集群、部署服务、扩缩容
  3. Docker Stack:多服务部署
  4. Kubernetes 基础:核心概念和组件
  5. Kubernetes 实战:Deployment、Service、扩缩容

🌍Docker第十一周:容器编排基础

欢迎来到 Docker 第十一周的学习!本周我们将学习容器编排的基础知识,包括 Docker Swarm 和 Kubernetes 的核心概念。


第一章:为什么需要容器编排

1.1 单容器部署的局限性

当应用规模扩大时,单容器部署面临以下问题:

问题 说明
扩缩容困难 需要手动启动/停止多个容器
故障恢复慢 容器崩溃后需要手动重启
负载不均 无法自动分配请求到不同容器
服务发现 容器IP变化时难以追踪

1.2 什么是容器编排

容器编排是自动化管理多个容器的技术,包括:

  • 容器的部署和调度
  • 容器的扩缩容
  • 容器的故障恢复
  • 负载均衡和流量分配
  • 服务发现和健康检查

第二章:Docker Swarm 入门

2.1 什么是 Docker Swarm

Docker Swarm 是 Docker 官方提供的原生容器编排工具,使用它可以将多个 Docker 主机组合成一个虚拟的 Docker 主机。

2.2 Docker Swarm 架构

复制代码
┌─────────────────────────────────────────────┐
│              Docker Swarm 集群                │
├─────────────────────────────────────────────┤
│                                             │
│        ┌───────────────────┐                │
│        │   Manager Node    │                │
│        │   (管理节点)       │                │
│        │                   │                │
│        │  • 集群管理        │                │
│        │  • 任务调度        │                │
│        │  • API 服务        │                │
│        └───────────────────┘                │
│              ↕ 通信                         │
│    ┌─────────┴─────────┐                    │
│    ↓                   ↓                    │
│ ┌──────────┐     ┌──────────┐              │
│ │  Worker  │     │  Worker  │              │
│ │  Node 1  │     │  Node 2  │              │
│ │          │     │          │              │
│ │ [容器1]  │     │ [容器2]  │              │
│ │ [容器2]  │     │ [容器3]  │              │
│ └──────────┘     └──────────┘              │
│                                             │
└─────────────────────────────────────────────┘

2.3 Docker Swarm 基本概念

概念 说明
Node(节点) 一个 Docker 主机
Manager Node 负责集群管理、调度、API服务
Worker Node 负责运行容器任务
Service(服务) 定义要在容器中运行的任务
Task(任务) 分发给 Worker 的工作单元
Stack(堆栈) 一组相关的服务
Ingress Network 容器与外部通信的网络

第三章:初始化 Docker Swarm

3.1 初始化 Swarm 集群

复制代码
# 初始化 Swarm(当前机器成为 Manager)
docker swarm init

# 指定 advertise 地址(多网卡时使用)
docker swarm init --advertise-addr 192.168.1.100

输出示例

复制代码
Swarm initialized: current node (abc123def456) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-xxxxx 192.168.1.100:2377

To add a manager to this swarm, run the following command:

    docker swarm join-token manager

3.2 查看集群信息

复制代码
# 查看节点列表
docker node ls

# 输出示例
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
abc123def456 *                 manager     Ready     Active         Leader           20.10.24
def789ghi012                   worker1    Ready     Active                           20.10.24

3.3 添加 Worker 节点

在其他机器上执行 Manager 提供的 join 命令:

复制代码
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.100:2377

3.4 添加 Manager 节点

复制代码
# 获取 manager token
docker swarm join-token manager

# 使用返回的命令添加新的 Manager
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.101:2377

3.5 离开 Swarm

复制代码
# Worker 离开
docker swarm leave

# Manager 离开(需要先移除)
docker swarm leave --force

第四章:部署服务

4.1 创建服务

复制代码
# 创建单个服务
docker service create --name myweb --replicas 3 -p 80:80 nginx:latest

参数说明

参数 说明
--name 服务名称
--replicas 副本数量
-p 端口映射

4.2 查看服务

复制代码
# 查看服务列表
docker service ls

# 输出示例
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
abc123         myweb     replicated   3/3        nginx:latest   *:80->80/tcp

# 查看服务详细信息
docker service inspect myweb

# 查看服务运行的任务
docker service ps myweb

4.3 扩缩容服务

复制代码
# 扩缩容(增加副本)
docker service scale myweb=5

# 缩容
docker service scale myweb=2

# 或者使用 update 命令
docker service update --replicas 3 myweb

4.4 更新服务

复制代码
# 更新镜像版本
docker service update --image nginx:alpine myweb

# 更新端口
docker service update --publish-rm 80:80 --publish-add 8080:80 myweb

# 滚动更新
docker service update --update-parallelism 1 --update-delay 10s myweb

4.5 删除服务

复制代码
docker service rm myweb

第五章:服务管理与故障恢复

5.1 健康检查

复制代码
# 创建带健康检查的服务
docker service create \
  --name myapp \
  --health-cmd="curl -f http://localhost/ || exit 1" \
  --health-interval=5s \
  --health-retries=3 \
  --replicas 3 \
  -p 80:80 \
  nginx:latest

5.2 故障恢复

Docker Swarm 会自动监控容器状态,并在容器失败时重新调度:

复制代码
# 模拟故障(停止一个容器)
docker stop $(docker ps -q --filter name=myapp | head -1)

# 查看 Swarm 如何自动恢复
docker service ps myapp

5.3 滚动更新

复制代码
# 创建服务并配置更新策略
docker service create \
  --name myapp \
  --replicas 4 \
  --update-delay=10s \
  --update-parallelism=1 \
  --image myapp:v1 \
  -p 80:80 \
  myapp:v1

# 滚动更新到新版本
docker service update --image myapp:v2 myapp

第六章:Docker Stack 部署

6.1 什么是 Docker Stack

Docker Stack 用于部署整个应用栈(多个相关服务)。

6.2 创建 docker-compose.yml

复制代码
version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      restart_policy:
        condition: on-failure

  api:
    image: myapi:latest
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      - db_data:/var/lib/mysql
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.role == manager

volumes:
  db_data:

6.3 部署 Stack

复制代码
# 部署 Stack
docker stack deploy -c docker-compose.yml myapp

# 查看 Stack 列表
docker stack ls

# 查看 Stack 中的服务
docker stack services myapp

# 查看 Stack 中的任务
docker stack ps myapp

6.4 管理 Stack

复制代码
# 移除 Stack
docker stack rm myapp

第七章:Kubernetes 基础

7.1 什么是 Kubernetes

Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩缩容和管理。

7.2 Kubernetes vs Docker Swarm

特性 Kubernetes Docker Swarm
复杂度 较高 较低
学习曲线 陡峭 平缓
功能 丰富 基础
社区 庞大 较小
生产使用 广泛 较少
YAML 配置 复杂 简单

7.3 Kubernetes 核心概念

复制代码
┌─────────────────────────────────────────────────┐
│              Kubernetes 集群                    │
├─────────────────────────────────────────────────┤
│                                             │
│  ┌─────────────────────────────────────┐      │
│  │           Control Plane             │      │
│  │  (Master Node)                     │      │
│  │  • API Server                      │      │
│  │  • Scheduler                       │      │
│  │  • etcd                            │      │
│  │  • Controller Manager              │      │
│  └─────────────────────────────────────┘      │
│              ↕ 通信                            │
│    ┌─────────┴───────────────────┐            │
│    ↓                               ↓          │
│ ┌──────────────┐         ┌──────────────┐     │
│ │  Worker 1    │         │  Worker 2    │     │
│ │              │         │              │     │
│ │ ┌──────────┐ │         │ ┌──────────┐ │     │
│ │ │   Pod    │ │         │ │   Pod    │ │     │
│ │ │(包含容器) │ │         │ │(包含容器) │ │     │
│ │ └──────────┘ │         │ └──────────┘ │     │
│ └──────────────┘         └──────────────┘     │
│                                             │
└─────────────────────────────────────────────┘

7.4 Kubernetes 核心组件

组件 说明
Pod Kubernetes 的最小调度单元,一个 Pod 可以包含多个容器
Deployment 管理 Pod 的部署和扩缩容
Service 为 Pod 提供稳定的访问入口
ReplicaSet 确保指定数量的 Pod 副本运行
Namespace 资源隔离和分组
ConfigMap 存储配置数据
Secret 存储敏感信息
Ingress 管理 HTTP/HTTPS 路由
PersistentVolume 持久化存储

第八章:Kubernetes 实战

8.1 Minikube 简介

Minikube 是在本地运行 Kubernetes 的工具,适合学习和测试。

8.2 安装 Minikube(可选)

复制代码
# Windows 安装(使用 Chocolatey)
choco install minikube

# 启动 Minikube
minikube start

# 检查状态
minikube status

# 访问 Kubernetes Dashboard
minikube dashboard

8.3 创建 Deployment

复制代码
# nginx-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:
          limits:
            memory: "128Mi"
            cpu: "500m"

8.4 部署到 Kubernetes

复制代码
# 创建 Deployment
kubectl apply -f nginx-deployment.yaml

# 查看 Deployment
kubectl get deployments

# 查看 Pod
kubectl get pods

# 查看 Pod 详情
kubectl describe pod nginx-deployment-xxxxx

8.5 创建 Service

复制代码
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

# 创建 Service
kubectl apply -f nginx-service.yaml

# 查看 Service
kubectl get services

# 访问服务(Minikube)
minikube service nginx-service

8.6 扩缩容

复制代码
# 扩缩容
kubectl scale deployment nginx-deployment --replicas 5

# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:alpine

# 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment

# 回滚
kubectl rollout undo deployment/nginx-deployment

8.7 删除资源

复制代码
# 删除所有资源
kubectl delete -f nginx-deployment.yaml
kubectl delete -f nginx-service.yaml

# 或者逐个删除
kubectl delete deployment nginx-deployment
kubectl delete service nginx-service

第九章:Docker Compose vs Kubernetes

9.1 对应关系

Docker Compose Kubernetes 说明
docker-compose up kubectl apply 部署应用
docker-compose down kubectl delete 删除应用
docker-compose.yml Deployment/Service YAML 配置文件
docker service Deployment/Pod 容器管理
docker stack Helm/ArgoCD 应用打包

9.2 选择建议

场景 推荐工具
本地开发、测试 Docker Compose
小规模生产环境 Docker Swarm
大规模生产环境 Kubernetes
多环境管理 Helm

第十章:常见问题与解决方案

10.1 问题:Swarm 服务无法启动

可能原因:资源不足或镜像拉取失败

解决方案

复制代码
# 查看服务日志
docker service logs myservice

# 查看节点资源
docker node ls
docker node inspect manager --pretty

10.2 问题:滚动更新失败

解决方案:手动回滚

复制代码
docker service rollback myservice

10.3 问题:Pod 一直处于 Pending 状态

可能原因:资源不足或调度失败

解决方案

复制代码
kubectl describe pod <pod-name>
kubectl get events --sort-by='.lastTimestamp'

本周总结

本周我们学习了:

  1. 容器编排基础:为什么需要编排
  2. Docker Swarm:初始化集群、部署服务、扩缩容
  3. Docker Stack:多服务部署
  4. Kubernetes 基础:核心概念和组件
  5. Kubernetes 实战:Deployment、Service、扩缩容

练习作业

  1. 初始化 Docker Swarm 集群
  2. 使用 Docker Stack 部署多服务应用
  3. 练习服务的扩缩容和滚动更新