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/
相关推荐
fanruitian5 分钟前
docker 为单个容器设置代理
运维·docker·容器
梁萌8 分钟前
Docker快速安装Tomcat
docker·容器·tomcat·镜像
灰色孤星A19 分钟前
瑞吉外卖项目学习笔记(四)@TableField(fill = FieldFill.INSERT)公共字段填充、启用/禁用/修改员工信息
java·学习笔记·springboot·瑞吉外卖·黑马程序员·tablefield·公共字段填充
逊嘘25 分钟前
【Java数据结构】ArrayList相关的算法
java·开发语言
Y编程小白39 分钟前
SpringBoot的创建方式
java·spring boot·后端
总是学不会.1 小时前
【集合】Java 8 - Stream API 17种常用操作与案例详解
java·windows·spring boot·mysql·intellij-idea·java集合
潜意识起点1 小时前
【潜意识Java】javaee中的SpringBoot在Java 开发中的应用与详细分析
java·spring boot·后端
mxbb.1 小时前
单点Redis所面临的问题及解决方法
java·数据库·redis·缓存
云和数据.ChenGuang1 小时前
《XML》教案 第1章 学习XML基础
xml·java·学习