DockerSwarm实战
大约 3 分钟
实战
1、初始化节点
## 防火墙设置
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.60.0/16" accept"
firewall-cmd --reload
## host设置
hostnamectl set-hostname swarm01 ## 192.168.60.101
hostnamectl set-hostname swarm02 ## 192.168.60.102
hostnamectl set-hostname swarm03 ## 192.168.60.103
## 检查是否开启Swarm模式
docker info | grep 'Swarm: active'
## 初始化manager节点
docker swarm init
docker swarm init --advertise-addr 192.168.60.101
docker swarm join-token manager
## 下线节点,使之不参与任务分派
docker node update --availability drain swarm02
## 上线节点,使之参与任务分派
docker node update --availability active swarm02
## 节点离开集群
docker swarm leave
## 创建网络
docker network create --attachable --driver overlay --subnet=172.66.0.0/16 --gateway=172.66.0.1 <NETWORK_NAME>
2、部署nginx
## 创建服务
docker service create --name first_nginx --replicas 2 --publish 80:80 nginx # 创建nginx服务
## 查看服务
docker service ls
docker service ps first_nginx
## 查看服务详情
docker service inspect first_nginx
## 弹性扩缩容
docker service scale first_nginx=5
docker service update --replicas 5 first_nginx
## 滚动更新
docker service update --image nginx:2.0 --update-parallelism 2 --update-delay 20s my_nginx
## 删除服务
docker service rm first_nginx
docker service ls
3、部署redis
## 创建 5 个副本,每次更新 2 个,更新间隔 10s,20% 任务失败继续执行,超出 20% 执行回滚,每次回滚 2 个
docker service create --replicas 5 --name redis \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
--rollback-monitor 20s \
--rollback-parallelism 2 \
--rollback-max-failure-ratio 0.2 \
redis:5
#### 参数说明
# --update-delay:定义滚动更新的时间间隔;
# --update-parallelism:定义并行更新的副本数量,默认为 1;
# --update-failure-action:定义容器启动失败之后所执行的动作;
# --rollback-monitor:定义回滚的监控时间;
# --rollback-parallelism:定义并行回滚的副本数量;
# --rollback-max-failure-ratio:任务失败回滚比率,超过该比率执行回滚操作,0.2 表示 20%。
## 实现服务的滚动更新
docker service update --image redis:6 redis
## 回滚服务,只能回滚到上一次操作的状态,并不能连续回滚到指定操作
docker service update --rollback redis
4、Stack
任务编排文件 cat nginx.yaml
version: "3.9"
services:
web:
image: nginx:1.13-alpine
hostname: "ngin-node-{{ .Task.Slot }}"
environment:
- TZ=Asia/Shanghai
ports:
- "80-88:80-88"
networks:
- overlay
deploy:
mode: replicated
replicas: 7
restart_policy: ## 重启设置
condition: on-failure ## 在运行失败的时候
delay: 10s ## 发生错误多长时间执行重启
max_attempts: 3 ## 在放弃之前尝试重新启动容器的次数(默认值: 永远不要放弃)
window: 120s ## 设置重启的超时时间
update_config:
parallelism: 2 ## 每次更新容器数量
delay: 10s ## 更新一组容器之间的等待时间
failure_action: pause ## 如果更新失败了怎么办,选择 continue、 rollback 或 pause (默认值: pause)
monitor: 500ms ## 每个容器更新后,持续观察是否失败了的时间
max_failure_ratio: 0.5 ## 在更新过程中可以容忍的故障率
rollback_config:
parallelism: 1 ## 每次回滚的容器数量。如果设置为0,所有容器同时回滚。
delay: 0s ## 每个容器组回滚之间的等待时间(默认值为0)
monitor: 500ms ## 每次任务更新后监视故障后的持续时间
healthcheck:
test: ["CMD", "wget", "-qO", "-", "http://localhost"] ## 定义检测的命令
interval: 2s ## 命令执行间隔,默认30秒
timeout: 2s ## 命令超时时间,默认30秒
retries: 3 ## 命令失败重试次数
start_period: 2s ## 启动延时,即容器启动后多久开始执行检测
resources: ## 资源限制
limits:
# cpus: '0.001'
memory: 1024M
reservations:
# cpus: '0.001'
memory: 64M
networks:
overlay:
执行任务
docker stack deploy -c nginx.yml my_nginx