跳至主要內容

DockerSwarm实战

知识库容器技术DockerDocker大约 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