Linux企业运维——Docker(十)三剑客之Docker Swarm


文章目录

  • Linux企业运维——Docker(十)三剑客之Docker Swarm
  • 一、Docker Swarm简介
  • 二、Docker Swarm部署实践
  • 三、监控Swarm集群
  • 四、编写脚本创建集群
  • 五、Swarm图形化管理界面


一、Docker Swarm简介

  • Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。
  • Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。
  • Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
  • Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。

Docker三剑客Docker machine、Docker compose、Docker Swarm中,只有Docker Swarm不需要额外安装,它是Docker中一个内嵌的子命令模块,相较于k8s更加轻量级,但应用于生产环境还存在一些问题。

docker运维高手群 运维 docker_运维


Docker Swarm 优点:

  • 任何规模都有高性能表现
  • 灵活的容器调度
  • 服务的持续可用性
  • 和 Docker API 及整合支持的兼容性
  • Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。

Docker Swarm 相关概念:

  • 节点分为管理 (manager) 节点和工作 (worker) 节点
  • 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
  • 服务 (Services) 是指一组任务的集合,服务定义了任务的属性。

二、Docker Swarm部署实践

实验环境
这里需要开启四台虚拟机,server1中部署了Habbor仓库,server2初始化一个swarm集群部署swarm管理节点,在server3、4部署swarm工作节点

(1)由于server4是新创建的一台虚拟机,我们要将其部署为swarm集群中的一个节点,所以需要将server2上的docker源指向文件复制给server4,为server4配置docker源,安装启动docker,设置其为开机自启动

docker运维高手群 运维 docker_docker_02


docker运维高手群 运维 docker_容器_03


(2)server1中部署了Habbor仓库,server2、3、4在做swarm集群部署时,从server1中拉取镜像,为了后续配置,这里为server1和server4做免密传输(server2、3之前做过)

docker运维高手群 运维 docker_docker_04


(3)在server2初始化一个swarm集群,部署swarm管理节点

docker运维高手群 运维 docker_运维_05


(4)在server3、4部署swarm工作节点,此时在server2可以看到swarm集群的所有节点

docker运维高手群 运维 docker_docker运维高手群_06


docker运维高手群 运维 docker_运维_07


docker运维高手群 运维 docker_运维_08


(5)停掉compose/目录下的docker服务,在habbor/目录下开启docker服务并打入后台运行

docker运维高手群 运维 docker_运维_09


docker运维高手群 运维 docker_linux_10


(6)将server2之前部署过的docker镜像仓库指向文件复制给server3、4,重载server3、4的docker服务

docker运维高手群 运维 docker_运维_11


docker运维高手群 运维 docker_docker运维高手群_12


docker运维高手群 运维 docker_docker运维高手群_13


docker运维高手群 运维 docker_docker_14


(7)由于habbor仓库做了认证,所以我们需要把server1中的认证证书复制给server2、3、4,server2、3、4才能从仓库中拉取镜像

docker运维高手群 运维 docker_docker运维高手群_15


(8)为server2、3、4配置server1中habbor仓库的域名地址解析

docker运维高手群 运维 docker_运维_16


docker运维高手群 运维 docker_docker运维高手群_17


docker运维高手群 运维 docker_linux_18


(9)在server1中上传myapp.tar,得到两个版本的myapp镜像,分别更改标签后上传到habbor仓库中

docker运维高手群 运维 docker_docker运维高手群_19


docker运维高手群 运维 docker_docker_20


docker运维高手群 运维 docker_运维_21

(10)在server2管理节点可以创建服务,使用–replicas指定创建三个副本(注意:一定要做端口映射,否则外网无法访问容器),此时查看服务可以看到三个swarm节点上各有一个副本服务(在生产环境中master尽量不要参与到负载均衡中,只负责调度)

docker运维高手群 运维 docker_docker_22


(11)此时在server1上连续访问server2、3、4任一swarm节点,都可以看到三个副本容器自动进行了负载均衡

docker运维高手群 运维 docker_容器_23


(12)这里还可以对服务副本数量进行扩充(规定扩至多少个),测试访问,可以看到6个副本容器自动进行了负载均衡

docker运维高手群 运维 docker_linux_24


docker运维高手群 运维 docker_docker_25

三、监控Swarm集群

(1)这里的监控服务需要由visualizer来提供,在server1中上传visualizer.tar,得到visualizer镜像,更改标签后上传到habbor仓库中

docker运维高手群 运维 docker_运维_26


docker运维高手群 运维 docker_运维_27


(2)创建监控,指定名字是viz,公开8080端口

docker运维高手群 运维 docker_运维_28


(3)访问172.25.19.2:8080,页面显示6个web服务和一个我们刚才创建的监控viz

docker运维高手群 运维 docker_运维_29


(4)将服务副本数量扩充到10个,再次访问,可以看到10个web服务和1个监控

docker运维高手群 运维 docker_linux_30


docker运维高手群 运维 docker_linux_31


(5)把原来的v1镜像更新为v2镜像

–update-parallelism:表示一次更新几个节点,这里指定一次更新5个

–update-delay:表示每几秒更新一次,这里指定每隔10秒更新一次

可以看到有5个节点已经ready

docker运维高手群 运维 docker_容器_32


在web页面也可以看到

docker运维高手群 运维 docker_容器_33


(6)如果版本更新后需要回滚,可以使用如图命令,默认一次回滚一个节点

docker运维高手群 运维 docker_docker_34


只剩一个节点没有回滚到v1版本了

docker运维高手群 运维 docker_容器_35

四、编写脚本创建集群

通过上面命令行的方式一步一步创建集群效率比较低,我们可以通过编写脚本来快速创建集群

(1)先删除之前的实验环境,在server2的家目录编写docker-compose.yml

docker运维高手群 运维 docker_容器_36


docker运维高手群 运维 docker_docker运维高手群_37


(2)编写好docker-compose.yml文件后,在当前目录下部署集群,名为mycluster,查看该集群,可以看到我们在yml配置文件中配置的6个副本

docker运维高手群 运维 docker_容器_38


(3)测试访问

docker运维高手群 运维 docker_运维_39


(4)修改脚本,扩充到60个副本,每次更新值为20

docker运维高手群 运维 docker_docker_40

[root@server2 ~]# cat docker-compose.yml 
version: "3.8"
services:
  web:
    image: myapp:v1
    ports:
      - "80:80"
    networks:
      - webnet
    deploy:
      replicas: 60
      update_config:
        parallelism: 20
        delay: 5s
      restart_policy:
        condition: on-failure

  visualizer:
    image: visualizer:latest
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints:
          - "node.role==manager"

networks:
  webnet:

docker运维高手群 运维 docker_docker运维高手群_41


(5)测试访问

docker运维高手群 运维 docker_运维_42


(6)修改脚本,将v1版本更新为v2

docker运维高手群 运维 docker_容器_43


docker运维高手群 运维 docker_linux_44


(7)测试访问,可以看到一部分已经更新到了v2版本

docker运维高手群 运维 docker_运维_45


(8)swarm集群在创建成功时会自动添加虚拟网卡

docker运维高手群 运维 docker_linux_46

五、Swarm图形化管理界面

将需要的安装包发送给server1

docker运维高手群 运维 docker_容器_47


导入镜像文件

docker运维高手群 运维 docker_linux_48


可以通过图形化界面创建项目

docker运维高手群 运维 docker_docker运维高手群_49


修改标签,上传到我们刚才创建的portainer项目中

docker运维高手群 运维 docker_运维_50


在图形化界面可以看到我们上传成功

docker运维高手群 运维 docker_运维_51


将server1中的portainer-agent-stack.yml传送给server2

docker运维高手群 运维 docker_容器_52


server2执行portainer-agent-stack.yml文件部署服务

docker运维高手群 运维 docker_linux_53


可以看到portainer项目内目前有两个服务,开放9000端口

docker运维高手群 运维 docker_运维_54


测试访问,首次进入需要创建用户

docker运维高手群 运维 docker_linux_55


可以通过scale按钮直接进行扩容操作,现在是60个服务

docker运维高手群 运维 docker_linux_56


我们将其修改为6个,可以看到图形界面做出响应

docker运维高手群 运维 docker_容器_57


docker运维高手群 运维 docker_docker运维高手群_58


在配置管理菜单栏,将仓库公开

docker运维高手群 运维 docker_运维_59


添加仓库信息

docker运维高手群 运维 docker_linux_60


添加2048游戏服务,将容器80端口映射到主机8000端口

docker运维高手群 运维 docker_docker运维高手群_61


访问8000端口,可以看到该服务已经启动

docker运维高手群 运维 docker_linux_62