Docker Swarm管理

Docker概念

  • Docker Swarm是Docker公司2014年出品的基于Docker的集群管理调度工具。能够将多台主机构建成一个Docker集群,并结合Overlay网络实现容器调度和互访

  • Docker Swarm使用GO语言开发,从Docker 1.12.0版本开始,Docker Swarm已经内置于Docker引擎中,无需再进行专门的安装配置。Docker Swarm允许用户以集群的方式运行和管理容器,提供了高可用性、负载均衡、弹性伸缩等特性,适用于各种规模的应用场景。

  • 用户开源只通过Swarm API来管理多个主机上的Docker

    • 标准的Docker API:包括Docker Client、Dokku、Compose、DockerUI、Jenkins等,它们可以通过Swarm工具与Docker集群进行通信。这些工具和服务可以通过标准的Docker API接口与Swarm集群进行交互,实现容器的创建、管理、调度等功能。
    • 集群管理API:用于集群的管理。Docker集群管理和编排的特性是通过SwarmKit进行构建的,其中Swarm模式是Docker内置支持的一种默认实现。集群管理API允许用户对Swarm集群进行更高级的管理操作,如集群的创建、节点的加入与退出、服务的部署与更新等。
  • Swarm集群包含Manager和Worker两类工作节点,基于Docker Engine可与部署任何类型的工作节点

    • Manager节点(管理节点)
      • 管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。
      • 管理节点维护着整个集群的状态,并负责决定在哪些工作节点上运行容器以及如何分配资源。
      • 一个Swarm集群可以有一个或多个Manager节点,其中一个被选举为Leader,负责领导整个集群。
      • 为了防止单点故障问题,一个Swarm集群一般都会包含多个Manager节点,这些Manager节点之间通过Raft算法维护着一致性。
    • Worker节点(工作节点)
      • 工作节点是实际运行容器的节点,它们接收来自管理节点的指令,并负责执行这些指令以运行容器。
      • 工作节点不参与Swarm集群的管理和决策,只是按照管理节点的指示运行容器,并定期向管理节点报告自身的状态。
      • 默认情况下,Manager节点同时也充当着Worker角色,可以运行任务(task)任务。但Manager节点与Worker节点角色并不是一成不变的,它们之间是可以相互转换的。Manager转变为Worker称为节点降级;Worker转变为Manager称为节点升级。
  • Docker Swarm的服务部署分为以下两种类型:

    • Replicated模式(副本模式):这是服务的默认部署模式。在Replicated模式下,用户需要指定服务的副本数量。Swarm会自动在集群中的各个节点上调度和管理这些副本,确保服务的高可用性和容错性。当某个节点上的副本出现故障时,Swarm会自动在其他节点上创建新的副本以替换故障副本。
    • Global模式(全局模式):在Global模式下,Swarm会为集群中的每个节点分配一个服务实例,不能指定服务的副本数量。当集群中的节点数量发生变化时,Swarm会自动在新增的节点上创建服务实例,并在删除的节点上移除服务实例,确保每个节点上都运行有服务实例。
  • 在Swarm集群中部署镜像创建一个服务时,一些大的应用上下文环境(运行环境)中需要各种服务配合工作

    • 这样的服务通常称之为微服务
  • 创建服务时,可以使用的容器镜像以及容器中要运行的命令,同时还可以定义以下选项:

    • 集群呀对外服务的端口
    • 在集群中用于访问之间相连的overlay网络
    • 滚动更新策略
    • 集群总运行的副本数量
  • Docker Swarm基本特性

    • 去中心化设计
    • 声明式服务模型
    • 协调预期抓鬼太与实际状态的一致性
    • 多主机网络
    • 负载均衡
    • 安全策略
    • 滚动更新
  • Docker Swarm架构图

    • Docker Swarm提供了基本的集群能力,能够使多个Docker Engine组合成一个group,提供多容器服务
    • Swarm使用标准的Dcker API

Docker Swarm集群部署

shell 复制代码
#设置基础环境
#设置主机名
#manager主机
[root@localhost ~]# hostnamectl set-hostname manager
[root@localhost ~]# bash
#worker01主机
[root@localhost ~]# hostnamectl set-hostname worker01
[root@localhost ~]# bash
#worker02主机
[root@localhost ~]# hostnamectl set-hostname worker02
[root@localhost ~]# bash
#设置所有主机的hosts文件
[root@manager ~]# vim /etc/hosts
192.168.10.101 manager
192.168.10.102 worker01
192.168.10.103 worker02
#关闭所有节点的防火墙
[root@manager ~]# systemctl stop firewalld
#部署Docker Swarm集群 在manager上创建集群
[root@manager ~]# docker swarm init --advertise-addr 192.168.10.101
#生成如下内容
docker swarm join --token SWMTKN-1-1kgbq53i5ssoee48vkci50zyga53wl1s4t7it7dybnkk2w29fc-bm3szq786ein3p80jw8n5ly3l 192.168.10.101:2377
#所有woker节点加入集群
[root@worker01 ~]# docker swarm join --token SWMTKN-1-1kgbq53i5ssoee48vkci50zyga53wl1s4t7it7dybnkk2w29fc-bm3szq786ein3p80jw8n5ly3l 192.168.10.101:2377
[root@worker01 ~]# docker swarm join --token SWMTKN-1-1kgbq53i5ssoee48vkci50zyga53wl1s4t7it7dybnkk2w29fc-bm3szq786ein3p80jw8n5ly3l 192.168.10.101:2377

Docker Swarm常用命令

shell 复制代码
#查看集群信息
[root@manager ~]# docker info
 Swarm: active
  NodeID: ce3weyfz1aeb9vx2c4g0i9ic6 #节点id
  Is Manager: true                  #表示当前为管理节点
  ClusterID: 5xe8q2v0a36yap8h8is8kssff #集群id
  Managers: 1						   #集群的管理节点个数
  Nodes: 3							   #集群共有节点
  Data Path Port: 4789				   #集群通信端口
#查看node系欸但详细信息
[root@manager ~]# docker node ls
#查看某节点详细信息
[root@manager ~]# docker node inspect woker01 

Docker节点管理

修改节点状态为Drain

shell 复制代码
[root@manager ~]# docker node update --availability drain manager、
[root@manager ~]# docker node ls

节点的 AVAILABILITY 有三种状态:Active、 Pause、Drain

  • Active:集群中该节点可以被指派任务。
  • Pause:集群中该节点不可以被指派新的任务,但是其他已经存在的任务保持运行。
  • Drain:集群中该节点不可以被指派新的任务,Swarm Scheduler 停掉已经存在的任务,并将它们调度到可用的节点上

添加标签元数据

  • 支持给每个节点添加标签元数据
  • 根据标签可选择性地调度某个服务部署到期望的一组节点上
shell 复制代码
#添加节点标签:
[root@manager ~]# docker node update --label-add group=g2 worker01
#检查节点详细信息
[root@manager ~]# docker node inspect worker01
#创建节点并应用约束
[root@manager ~]# docker service create --name mynginx --constraint 'node.labels.group==g2' nginx
#查看mynginx容器所在的主机
[root@manager ~]# docker service ps mynginx

节点提权/降权

shell 复制代码
#将 worker01 和 worker02 都升级为管理节点
[root@manager ~]# docker node promote worker01 worker02
#[root@manager ~]# docker node ls
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
ce3weyfz1aeb9vx2c4g0i9ic6 *   manager    Ready     Drain          Leader           26.1.4
un1pyht5a5terxh7zudev729a     worker01   Ready     Active         Reachable        26.1.4
kjp3nhcxp3qwdog075ivxlje7     worker02   Ready     Active         Reachable        26.1.4
#对上面已提权的 worker01 和 worker02 执行降权操作
[root@manager ~]# docker node demote worker01 worker02

退出Swarm集群

shell 复制代码
#work节点退出swarm
[root@worker01 ~]# docker swarm leave 
#manager节点退出swarm 需加强制选项
[root@manager ~]# docker swarm leave --force

Docker Swar服务管理

  • 创建与删除服务
shell 复制代码
#使用命令创建 Docker服务,从Docker镜像 nginx创建一个名称为 web 的服务,指定服务副本数为 2。
[root@manager ~]# docker service create -p 80:80 --replicas 2 --name web nginx
#查看服务日志
[root@manager ~]# docker service logs -f web
#查看当前已经部署启动的全部应用服务
[root@manager ~]# docker service ls
#查询指定服务的详细信息
[root@manager ~]# docker service ps web
#删除服务
[root@manager ~]# docker service rm web
  • 显示服务详细信息
shell 复制代码
#以 JSON 格式显示方法 Web 服务的详细信息
[root@manager ~]# docker service inspect web
#美化显示的详细信息
[root@manager ~]# docker service inspect --pretty web
  • 服务的扩容缩容
shell 复制代码
#将前面已经部署的 2 个副本的 Web 服务,扩容到 3 个副本
[root@manager ~]# docker service scale web=3
#通过 docker service ps web 命令查看服务扩容结果
[root@manager ~]# docker service ps web
#指定的副本数小于当前应用服务拥有副本数即缩容 大于指定副本数的会被删除
[root@manager ~]# docker service scale web=1
#通过 docker service ps web 命令查看服务缩容结果
[root@manager ~]# docker service ps web
  • 滚动更新
shell 复制代码
#创建时指定更新延时
[root@manager ~]# docker service create --replicas 3 --name redis --update-delay 10s hub.atomgit.com/amd64/redis:7.0.13
[root@manager ~]#  docker service ps redis
#更新已经部署服务所在容器中使用的镜像版本
[root@manager ~]# docker service update --image hub.atomgit.com/library/redis:7.0-高山
[root@manager ~]# docker service ps redis
  • 添加自定义Overlay网络
shell 复制代码
#在创建服务时,通过--network选项指定使用的网络为已存在的 Overlay 网络
[root@manager ~]# docker network create --driver overlay my-network
#在创建时指定network
[root@manager ~]# docker service create --replicas 3 --network my-network --name myweb nginx
  • 数据卷创建于应用
shell 复制代码
#创建数据卷
[root@manager ~]# docker volume create product-kgc
#将nginx容器连接到数据卷
[root@manager ~]# docker service create --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html --replicas 1 --name kgc-web-01 nginx
#查看详细信息
[root@manager ~]# docker service ps kgc-web-01
#查看数据卷
[root@manager ~]# docker volume inspect product-kgc
#到work01中查看数据是否进行同步
[root@worker01 ~]# cd /var/lib/docker/volumes/product-kgc/_data/ 
[root@worker01 _data]# mkdir test01 test02 
[root@worker01 _data]# docker ps
  • 使用共享存储方式同步数据
shell 复制代码
#在所有节点安装nfs-utils
[root@manager ~]# yum -y install nfs-utils
#在主节点设置共享目录
[root@manager ~]# vim /etc/exports
/var/vhost/www/aa *(rw,sync,no_root_squash)
#创建共享目录
[root@manager ~]# mkdir /var/vhost/www/aa
#启动nfs服务
[root@manager ~]# systemctl start nfs
[root@manager ~]# systemctl start rpcbind
#其他worker节点挂载目录
[root@worker01 ~]# mkdir /var/vhost/www/aa
[root@worker01 ~]# mount 192.168.10.101:/var/vhost/www/aa /var/vhost/www/aa/
[root@worker02 ~]# mkdir /var/vhost/www/aa
[root@worker02 ~]# mount 192.168.10.101:/var/vhost/www/aa /var/vhost/www/aa/
相关推荐
雷神乐乐8 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|13 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
逊嘘32 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
morris13139 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
七星静香1 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
Jacob程序员1 小时前
java导出word文件(手绘)
java·开发语言·word
ZHOUPUYU1 小时前
IntelliJ IDEA超详细下载安装教程(附安装包)
java·ide·intellij-idea
stewie61 小时前
在IDEA中使用Git
java·git
Elaine2023911 小时前
06 网络编程基础
java·网络