实验环境

docker version :  20.10
操作系统: centos7.9
机器
192.168.0.51  manager
192.168.0.52  worker
192.168.0.53  worker
192.168.0.54  worker

# 一般建议节点数量为奇数,防止出现阻塞情况

故障演示:
3个管理节点的失效配额为(3-1)/2=1,若失效数量若小于或等于配额,则swarm自动执行选举与切换;若超出配额范围,则须手动强制重建群集(docker swarm init-f/--force)。
出现故障时,需要查看群集、节点、服务、任务等信息,结合命令行输出与日志对故障原因进行定位。
Centos 7下的docker日志文件默认为/var/log/message,管理节点的/var/lib/docker/swarm/目录用于保存群集状态与管理日志,可以按备份目录-导入目录-
重建群集的步骤执行故障恢复。docker官方建议备份与导入操作在docker主进程停用后执行。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

Day23-swarm _nginx

swarm 是纯去中心化的,相较于K8s 他的scheduler 等被封装,弱化了底层
所以其实学习了swarm 再去学习k8s 是非常好的一个学习过程

  • 1.
  • 2.
  • 3.
1.Swarm集群的管理和编排是使用嵌入docker引擎的swarmkit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
2.Node一个节点是docker引擎集群的一个实例。
您还可以将其视为Docker节点。
您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的节点
要将应用程序部署到swarm,请将服务定义提交给管理器节点。管理器节点将称为任务的工作单元分派给工作节点。
Manager节点还执行维护所需群集状态所需的编排和集群管理功能,Manager节点选择单个领导者来执行但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。
编排任务。
工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,代理程序在每个工作程序节点上运行,并报告分配给它的任务。
工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。
3.Service一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。
4.Task任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点目
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

创建swarm集群

创建集群的manager

# 51机器  建立manager
docker swarm init --advertise-addr 192.168.0.52


# 加入swarm 集群
docker swarm join --token SWMTKN-1-5336q5p54aoltwz78nlh4skrz1kkxdg7yadz4wsuorbochf5ah-br7ulw9iyce25cu1f4v4wvfan 192.168.0.51:2377


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

Day23-swarm _nginx_02

查看集群成员节点

docker node ls 
docker node --help #  节点管理


demote  降级  一般用于主节点降级,成为工作节点
inspect
ls
promote 升级 ---- 如果存在主节点 则会成为备用主节点,主节点出现挂的情况就第一时间成为主节点
ps
rm
update 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

Day23-swarm _centos_03Day23-swarm _swarn_04

service的管理

docker service --help
  • 1.

Day23-swarm _centos_05

创建服务器

docker network create -d overlay nginx_net
docker network ls
  • 1.
  • 2.

Day23-swarm _swarn_06

# 创建一个服务 Nginx
docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx
docker service ls
  • 1.
  • 2.
  • 3.

Day23-swarm _centos_07

这块的 * 代表集群中所有的 容器都被占用了80这个端口,只是这个服务 跑在那台服务器的区别
这个和k8s十分相似,只是我们在访问swarm集群的时候,svc  和scheduler被封装了 所以
这块的感受不是特别的清晰
  • 1.
  • 2.
  • 3.

Day23-swarm _centos_08Day23-swarm _centos_09Day23-swarm _nginx_10Day23-swarm _centos_11

docker service inspect --pretty my_nginx
  • 1.

Day23-swarm _docker_12

查看这个服务在哪里运行

docker service ps my_nginx
  • 1.
  • 2.
  • 3.

Day23-swarm _docker_13

访问一下服务
192.168.0.51 即可 默认80端口
51、52、53、54 都是可以的,这个和K8s的访问机制是相似的
  • 1.
  • 2.

Day23-swarm _docker_14Day23-swarm _swarn_15

扩充服务
docker service scale my_nginx=4

# 此处我做了个实验 在其他三个启动成功 最后一个快要成功的时候进行打断
然后在进行 同样的命令
我们可以看到他失败的那一层
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

Day23-swarm _swarn_16Day23-swarm _swarn_17

模拟宕机

Day23-swarm _swarn_18

这四个节点,我让主节点51上的服务停止,会怎么样?
我先把副本数弄到6
  • 1.
  • 2.

Day23-swarm _docker_19Day23-swarm _nginx_20Day23-swarm _swarn_21

其实他就更改了一下id 然后重新回到了主节点上进行任务了
地下的 \_ 都是旧的 上面是新的


  • 1.
  • 2.
  • 3.
  • 4.

升降级

docker node promote centos7-jichao-052
  • 1.

Day23-swarm _centos_22

这个时候可以理解为 52 为备用节点了,处于一个预备的状态,主节点一挂 他就会成为主节点了

## 我们把主节点51降级
docker node demote centos7-jichao-051
  • 1.
  • 2.
  • 3.
  • 4.

Day23-swarm _centos_23

降级之后,我们发现52成为了主节点,同时其他的节点状态为unknown
随后恢复正常了
我们这个时候只能在主节点52上面进行命令输入
# 假如这个时候52也挂了呢?
  • 1.
  • 2.
  • 3.
  • 4.

Day23-swarm _centos_24Day23-swarm _nginx_25

答案是他会报错
原因是 这是swarm集群最后一个主节点
  • 1.
  • 2.

离开集群

# 这块我们拿54机器做经验
# 54
docker swarm leave
# 52
docker node rm centos7-jichao-054

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Day23-swarm _docker_26
Day23-swarm _docker_27

服务情况
  • 1.

Day23-swarm _docker_28

再返回集群
docker swarm join --token SWMTKN-1-5336q5p54aoltwz78nlh4skrz1kkxdg7yadz4wsuorbochf5ah-br7ulw9iyce25cu1f4v4wvfan 192.168.0.52:2377
docker service ps my_nginx
  • 1.
  • 2.

Day23-swarm _centos_29Day23-swarm _nginx_30

不分配节点

# 不分配
docker node update --availability drain centos7-jichao-054
  • 1.
  • 2.

Day23-swarm _swarn_31

# 激活节点
docker node update --availability active centos7-jichao-054
  • 1.
  • 2.

滚动更新

# 我把主节点换回了51  因为52没有武功

docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6



# 更新

docker service update --image redis:3.0.7 redis


# 定时更新
docker service create --name my_web --replicas 10 --update-delay 10s --update-parallelism 2 --update-failure-action continue nginx:1.12


# 创建服务是设置回滚
docker service create --name my_web --replicas 10 --rollback-parallelism 2 --rollback-moinitor 20s --rollback-max-failure-ratio .2 nginx:1.12



#手动回滚
docker service  update --rollback my_web 
就会自动回到旧的版本了 也就是我们上面说的下旧上新
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

Day23-swarm _centos_32Day23-swarm _swarn_33Day23-swarm _docker_34
Day23-swarm _centos_35

重建集群

docker swarm init --force-new-cluster
docker node rm centos7-jichao-054
docker node rm centos7-jichao-053
docker node rm centos7-jichao-052


  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

Day23-swarm _swarn_36Day23-swarm _docker_37Day23-swarm _nginx_38Day23-swarm _nginx_39Day23-swarm _docker_40

强制负载均衡

docker service update --force my_web
  • 1.

Day23-swarm _nginx_41

部署swarm的集群监控

docker pull dockersamples/visualizer
docker service create --name viz --publish=8080:8080 --constraint=node.role==manager --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizerd
  • 1.
  • 2.

Day23-swarm _docker_42

访问页面

Day23-swarm _docker_43

数据管理

创建存储卷
docker service create --mount=type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> --name myservice <IMAGE>

查看详细信息 
docker volume inspect <VOLUME-NAME>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
创建volume实例
docker service create --mount type=volume,src=nginx-vol,dst=/usr/share/nginx/html --name my_nginx nginx

docker service scale my_nginx=3

docker ps -a 
docker exec -it       id         bash



docker volume ls

cd /var/lib/docker/volumes/nginx-vol/_data/
ls -ld *

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

Day23-swarm _docker_44
Day23-swarm _nginx_45
Day23-swarm _centos_46
Day23-swarm _docker_47
Day23-swarm _nginx_48
Day23-swarm _swarn_49

挂载
Bind Mount
# 读写挂载
dokcer service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> --name myservice-1   <IMAGE>
# 只读挂载
docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,ro --name myservice-2  <IMAGE>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
读写挂载
mkdir -p  /app/wwwroot/
docker service create --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html --name bind-nginx nginx

  • 1.
  • 2.
  • 3.

Day23-swarm _centos_50
Day23-swarm _centos_51

nfs

# 51
yum -y install nfs*,net-tools
mkdir -p /nfs/data
vim /etc/exports
/nfs/data  <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash)
chmod 777 -R /nfs/data


# 52 53 54
yum -y install nfs-utils
showmount -e 192.168.0.51
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
Day23-swarm _nginx_52Day23-swarm _nginx_53
启动服务
docker service create --mount 'type=volume,src=nfs-vol,dst=/usr/share/nginx/html,volume-opt=type=nfs,volume-opt=device=:/opt/container_data,"volume-opt=o=addr=192.168.0.51,vers=4,soft,timeo=180,bg,tcp,rw"' --name nginx-nfs nginx
  • 1.

Day23-swarm _docker_54

docker service scale nginx-nfs=3
  • 1.

Day23-swarm _nginx_55

stack

docker stack 的介绍

单机模式下,我们可以使用Docker Compose来编排多个服务,而DockerSwarm只能实现对单个服务的简单
部署。本文的主角Docker Stack,通
过Docker Stack我们只需对已有的docker-compose.yml
配置文件稍加改造就可以完成Docker集群环境下的多服务编排。


Docker stack会忽略了"构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。
所以docker-compose更适合于开发场景;Docker Compose是一个Python项目,在内部,
它使用Docker API规范来操作容器。一所以需要安装Docker-compose,
以便与Docker一起在您的计算机上使用;Docker Stack功能包含在Docker引擎中。
你不需要安装额外的包来使用它,docker stacks只是swarm mode的一部分。
Docker stack不支持基于第2版写的docker-compose.yml,也就是version版本至少为3。
然而Docker Compose对版本为2和3的 文件仍然可以处理;

docker stack把docker compose的所有工作都做完了,
因此docker stack将占主导地位同时,对于大多数用户来说,
切换到使用docker stack既不困难,也不需要太多的开销。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
命令
docker stack deploy
部署新的堆栈或更新现有堆栈
docker stack ls
列出现有堆栈
docker stack ps
列出堆栈中的任务
docker stack rm
删除一个或多个堆栈
docker stack services 列出堆栈中的服务
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

Day23-swarm _nginx_56

部署服务
vim docker-compose.yaml
-----

version: "3"
services:
  redis:
    image: redis:alpine
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  db:
    image: postgres:9.4
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_HOST_AUTH_METHOD: "trust"
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend




docker stack deploy example --compose-file=docker-compose.yaml 

docker stack services example
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.

Day23-swarm _docker_57
Day23-swarm _centos_58Day23-swarm _nginx_59Day23-swarm _docker_60