天下風雲出我輩
一入江湖歲月催

Docker Swarm

Docker Swarm 是 Docker 官方项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。它是Docker公司推出的官方容器集群平台,基于Go语言实现,代码在https://github.com/docker/swarm,使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

Docker Swarm是原生支持Docker集群管理的工具。它可以把多个Docker主机组成的系统转换为单一的虚拟Docker主机,使得容器可以组成跨主机的子网网络。 在很多台机器上部署Docker,组成一个Docker集群,并把整个集群的资源抽象成资源池,使用者部署Docker应用的时候,只需要将应用交给Swarm,Swarm会根据整个集群资源的使用情况来分配资源给部署的Docker应用,可以将这个集群的资源利用率达到最大。

Swarm主从架构

Swarm集群通过Raft协议在多个管理节点中实现共识,工作节点上运行agent接受管理节点的统一管理和任务分配。

 

基本概念

1、Swarm集群

Swarm集群为一组被统一管理起来的Docker主机。集群是Swarm所管理的对象,这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点响应外部的管理请求,其他主机作为工作节点来实际运行Docker容器。

当用户使用Swarm集群时,首先定义一个服务(指定状态,复制个数,网络,存储,端口等)然后通过管理节点发出启动服务的指令,管理节点随后会按照指定的服务规则进行调度,在集群中启动起来整个服务,并确保它正常运行。

2、节点

节点(Node)是Swarm集群中最小的资源单位,每个节点实际上都是一台Docker主机。

Swarm集群中节点分为两种:

  • 管理节点(Manager):负责响应外部对集群的操作请求,并维持集群中资源,分发任务给工作节点。同时,多个管理节点之间通过Raft协议构成共识。一般推荐每个集群设置5-7个管理节点。
  • 工作节点(Worker):负责执行管理节点安排的具体任务。默认情况下,管理节点自身也同时是工作节点。用户可以通过docker node promote 命令来提升一个工作节点为管理节点;或者通过docker node demote命令来将一个管理节点降级为工作节点。

3、服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。

服务有两种模式:

  • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
  • global services 每个工作节点上运行一个任务
    两种模式通过 docker service create 的 –mode 参数指定。

5、服务的外部访问

Swarm集群中的服务要被集群外部访问,必须要能允许任务的响应端口映射出来。Swarm中支持入口负载均衡(ingress load balancing)的映射模式,该模式下,每个服务都会被分配一个公开端口,该端口在集群中任意节点上都可以访问到,并被保留给改服务。当有请求发送到任意节点的公开端口时,该节点若并没有实际执行服务相关的容器,则会通过路由机制将请求转发给实际执行了服务容器的工作节点。

创建Swarm集群

1、使用swarm

docker 1.12+ 的版本自带Swarm模式的相关功能,使用 234 、230主机作为管理节点(同时也具备工作节点功能)。

Swarm集群主要操作命令:

  • swarm init: 在管理节点上创建一个集群
  • node list:列出集群中的节点信息
  • swarm join:加入一个新的节点到已有集群中
  • swarm update:更新一个swarm集群
  • swarm leave: 离开一个集群
  • docker service 命令等

2、创建集群

#初始化集群,会自动把当前节点设置为管理节点
[[email protected] ~]# docker swarm init --advertise-addr 192.168.1.234
Swarm initialized: current node (dn76b8r2c01iqikn3lseeerpz) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv-efn4v6v2jiu80p5ejmee
v0qpb 192.168.1.234:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

#查看swarm worker的连接令牌
docker swarm join-token worker

#查看swarm manager的连接令牌
docker swarm join-token manager

注意提示返回的token就是节点加入集群需要的信息。这里是两个管理节点 按照提示执行’docker swarm join-token manager’ 查看返回的token,在Host2中执行加入集群。

3、加入集群并成为管理节点

#查看管理节点的token
[[email protected] ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:

docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv-11xvmfwn8sbchpohn
66bdyxch 192.168.1.234:2377

#在Host2中加入集群
[[email protected] ~]# docker swarm join --token SWMTKN-1-3wmqfhzq4u4gvizdbx7yriwz4vt1otppph3fsudlmczmzydpsv
-11xvmfwn8sbchpohn66bdyxch 192.168.1.34:2377
This node joined a swarm as a manager.

4、查看集群节点信息

[[email protected] ~]# docker node ls
ID                            HOSTNAME   STATUS       AVAILABILITY     MANAGER STATUS      ENGINE VERSION
dn76b8r2c01iqikn3lseeerpz     host1      Ready        Active            Leader              18.09.0
1a8u2l2hvze8m53vbsrjknco8 *   host2      Ready        Active           Reachable            18.09.0

5、升降级节点

#将节点升级为manager
docker node promote host2

#将节点降级为worker
docker node demote host2

部署集群服务

1、在集群中创建一个nginx服务,副本数为2,映射端口8086>80,镜像为nginx:1.14.2-alpine

docker service create --replicas 2 --name nginx -p 8086:80 nginx:1.14.2-alpine
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service converged 

#查看服务信息
[[email protected] ~]# docker service ls
ID                  NAME         MODE            REPLICAS     IMAGE                 PORTS
ni3oqz5un7oe        nginx      replicated          2/2        nginx:1.14.2-alpine   *:8086->80/tcp

2、列出服务的任务信息

[[email protected] ~]# docker service ps nginx 
ID              NAME        IMAGE             NODE    DESIRED STATE       CURRENT STATE     ERROR   PORTS
uit9jtrt6jno   nginx.1   nginx:1.14.2-alpine  host1   Running  Running 37 seconds ago          
mpsqts6y60s3   nginx.2   nginx:1.14.2-alpine  host2    Running  Running 15 seconds ago

3、使用scale命令参数弹性伸缩服务个数。

#设置nginx服务个数为4个
[[email protected] ~]# docker service scale nginx=4
nginx scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   
2/4: running   
3/4: running   
4/4: running   
verify: Service converged 

#查看服务信息
[[email protected] ~]# docker service ps nginx 
ID                  NAME        IMAGE                 NODE       DESIRED STATE       CURRENT STATE       
uit9jtrt6jno        nginx.1    nginx:1.14.2-alpine   host1       Running         Running 9 hours ag
f4u4gbsepd6b        nginx.2     nginx:1.14.2-alpine   host2      Running         Running 7 hours ago             
mpsqts6y60s3         \_ nginx.2   nginx:1.14.2-alpine   host2    Shutdown        Complete 7 hours ago               
lv6vkwnvzv63        nginx.3      nginx:1.14.2-alpine   host1     Running         Running 13 seconds ago     
ad635fz3d4fp        nginx.4     nginx:1.14.2-alpine   host2      Running         Running 13 seconds ago

4、测试访问http://192.168.1.234:8086 或者http://192.168.1.230:8086查看服务是否正常

[[email protected] ~]# curl http://192.168.1.230:8086
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.......................................

5、服务镜像升级与回滚

#将nginx服务升级到nginx:1.15.8-alpine版本
[[email protected] ~]# docker service update --image nginx:1.15.8-alpine --update-parallelism 2 --update-delay 10s 
nginx 

#回滚
[[email protected] ~]# docker service update --rollback nginx

–update-parallelism: 同时更新的最大任务数量

–update-delay:更新服务的时间间隔

Docker service 命令列表

命令 描述
docker service create 创建一个新服务
docker service inspect 显示一个或多个服务的详细信息
docker service logs 获取服务或任务的日志
docker service ls 列出服务列表
docker service ps 列出一个或多个服务的任务
docker service rm 删除一个或多个服务
docker service rollback 还原对服务的更改
docker service scale 伸缩服务的数量
docker service update 更新服务

 

Docker官方参考文档:docker swarm

赞(2) 打赏
未经允许不得转载:Anonym0x1 » Docker Swarm

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏