📚前言
👀回顾,系统学习docker系列已发布内容:
【docker基础】第三课:镜像管理与Dockerfile基础
【docker基础】第五课:Docker网络详解-CSDN博客
【docker基础】第六课:Web应用与数据库容器部署-CSDN博客
【docker基础】 第七课:Docker Compose 多容器实战-CSDN博客
【docker基础】 第八周:容器监控与应用更新策略-CSDN博客
【docker基础】第九周:Docker安全与镜像优化-CSDN博客
【docker基础】Docker第十周:CI/CD集成-CSDN博客
🔗相关文档:
【docker基础】Ubuntu 安装 Docker 超详细小白教程
📒本课学习目标:
- 容器编排基础:为什么需要编排
- Docker Swarm:初始化集群、部署服务、扩缩容
- Docker Stack:多服务部署
- Kubernetes 基础:核心概念和组件
- 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'
本周总结
本周我们学习了:
- 容器编排基础:为什么需要编排
- Docker Swarm:初始化集群、部署服务、扩缩容
- Docker Stack:多服务部署
- Kubernetes 基础:核心概念和组件
- Kubernetes 实战:Deployment、Service、扩缩容
练习作业:
- 初始化 Docker Swarm 集群
- 使用 Docker Stack 部署多服务应用
- 练习服务的扩缩容和滚动更新