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称为节点升级。
- 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/