Docker Swarm #
什么是Docker Swarm? #
Docker Swarm是Docker官方提供的容器集群管理工具,可以将多个Docker主机组成一个虚拟的Docker主机。
Swarm架构 #
text
┌─────────────────────────────────────────────────────┐
│ Swarm 架构 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ Manager Nodes │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │Manager 1│ │Manager 2│ │Manager 3│ │ │
│ │ │(Leader) │ │(Reachable)│ │(Reachable)│ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ┌─────────────────────▼───────────────────────┐ │
│ │ Worker Nodes │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ Worker │ │ Worker │ │ Worker │ │ │
│ │ │ 1 │ │ 2 │ │ 3 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
核心概念 #
| 概念 | 说明 |
|---|---|
| Node | Swarm集群中的Docker主机 |
| Service | 在Swarm中运行的服务 |
| Task | 服务的单个容器实例 |
| Stack | 一组相关服务的集合 |
集群管理 #
初始化Swarm #
bash
# 初始化Swarm集群
docker swarm init --advertise-addr <MANAGER-IP>
# 查看加入命令
docker swarm join-token worker
docker swarm join-token manager
# 查看节点
docker node ls
# 查看节点详情
docker node inspect <NODE-ID>
加入集群 #
bash
# Worker节点加入
docker swarm join --token <TOKEN> <MANAGER-IP>:2377
# Manager节点加入
docker swarm join-token manager
docker swarm join --token <MANAGER-TOKEN> <MANAGER-IP>:2377
节点管理 #
bash
# 查看节点
docker node ls
# 更新节点
docker node update --availability active <NODE-ID>
docker node update --availability pause <NODE-ID>
docker node update --availability drain <NODE-ID>
# 提升为Manager
docker node promote <NODE-ID>
# 降级为Worker
docker node demote <NODE-ID>
# 删除节点
docker node rm <NODE-ID>
# 离开集群
docker swarm leave
docker swarm leave --force # Manager节点
服务管理 #
创建服务 #
bash
# 创建服务
docker service create --name web -p 80:80 nginx
# 创建带副本的服务
docker service create --name web --replicas 3 -p 80:80 nginx
# 创建带资源限制的服务
docker service create \
--name web \
--replicas 3 \
--limit-cpu 0.5 \
--limit-memory 512m \
-p 80:80 \
nginx
查看服务 #
bash
# 查看所有服务
docker service ls
# 查看服务详情
docker service ps web
# 查看服务日志
docker service logs web
docker service logs -f web
更新服务 #
bash
# 更新副本数
docker service scale web=5
# 更新镜像
docker service update --image nginx:alpine web
# 更新端口
docker service update --publish-rm 80 --publish-add 8080:80 web
# 更新资源限制
docker service update --limit-cpu 1 --limit-memory 1g web
# 滚动更新
docker service update \
--image nginx:latest \
--update-parallelism 2 \
--update-delay 10s \
web
删除服务 #
bash
# 删除服务
docker service rm web
服务配置 #
完整服务配置 #
bash
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
--mount type=volume,source=data,target=/data \
--env NODE_ENV=production \
--env DB_HOST=db \
--network app-network \
--constraint node.role==worker \
--limit-cpu 0.5 \
--limit-memory 512m \
--reserve-cpu 0.25 \
--reserve-memory 256m \
--restart-condition on-failure \
--restart-delay 10s \
--restart-max-attempts 3 \
--update-parallelism 1 \
--update-delay 10s \
--update-failure-action rollback \
nginx:alpine
环境变量 #
bash
# 设置环境变量
docker service create \
--name app \
--env NODE_ENV=production \
--env DB_HOST=db \
--env-file .env \
myapp
Secrets管理 #
bash
# 创建secret
echo "my_password" | docker secret create db_password -
# 使用secret
docker service create \
--name db \
--secret db_password \
-e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_password \
mysql:8.0
Configs管理 #
bash
# 创建config
docker config create nginx_config nginx.conf
# 使用config
docker service create \
--name web \
--config source=nginx_config,target=/etc/nginx/nginx.conf \
-p 80:80 \
nginx
Stack部署 #
docker-compose.yml #
yaml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
networks:
- frontend
deploy:
replicas: 3
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
app:
image: myapp
networks:
- frontend
- backend
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 512M
db:
image: mysql:8.0
networks:
- backend
volumes:
- db-data:/var/lib/mysql
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
networks:
frontend:
backend:
volumes:
db-data:
部署Stack #
bash
# 部署stack
docker stack deploy -c docker-compose.yml myapp
# 查看stack
docker stack ls
# 查看stack服务
docker stack services myapp
# 查看stack任务
docker stack ps myapp
# 删除stack
docker stack rm myapp
网络管理 #
创建Overlay网络 #
bash
# 创建overlay网络
docker network create --driver overlay my-network
# 创建加密网络
docker network create --driver overlay --opt encrypted my-network
# 查看网络
docker network ls
服务使用网络 #
bash
# 创建网络
docker network create --driver overlay app-network
# 服务使用网络
docker service create \
--name web \
--network app-network \
-p 80:80 \
nginx
负载均衡 #
Swarm内置负载均衡 #
bash
# Swarm自动负载均衡
# 服务副本自动分配到不同节点
# 通过任意节点IP访问服务
# 创建3副本服务
docker service create --name web --replicas 3 -p 80:80 nginx
# 访问任意节点IP
curl http://node1:80
curl http://node2:80
curl http://node3:80
路由网格 #
text
┌─────────────────────────────────────────────────────┐
│ 路由网格 │
├─────────────────────────────────────────────────────┤
│ │
│ 请求 ──→ 任意节点 ──→ 路由网格 ──→ 服务副本 │
│ │
│ Node1 (80) ──┐ │
│ │ │
│ Node2 (80) ──┼──→ 负载均衡 ──→ Web1, Web2, Web3 │
│ │ │
│ Node3 (80) ──┘ │
│ │
└─────────────────────────────────────────────────────┘
小结 #
本节学习了Docker Swarm集群编排:
- Swarm架构和核心概念
- 集群管理操作
- 服务管理操作
- Stack部署方式
- 网络和负载均衡
下一步 #
接下来,让我们学习 安全最佳实践,了解Docker的安全配置方法。