1:Docker Swarm出现背景
- Docker的单节点引擎工具Docker Compose,它能够在单一节点上管理和编排多个容器,当我们的服务和容器数量较小时可以使用Docker Compose来管理容器
- 然而随着我们的业务规模越来越大,我们的容器规模也逐渐增大时,数量庞大的容器管理将给我们带来许多挑战。Docker官方为了解决多容器管理的问题推出了Docker Swarm,我们可以用它来管理规模更大的容器集群
2:Docker Swarm的优势
- 随着Docker容器越来越火,这时容器编排工具Mesos和k8s也开始崭露头角,由于Swarm是Docker官方推出的容器集群管理工具,因此Swarm最大优势之一就是原声支持Docker API,给用户带来极大的便利,原来的Docker用户可以很方便地将服务迁移到Swarm中来,当然Swarm的优点不止这些
- 1:分布式:Swarm使用Raft(一种分布式一致性协议)协议来做集群间数据一致性保障,使用多个容器节点组成管理集群,从而避免单点故障
- 2:安全:Swarm使用TLS双向认证来确保节点之间的通信安全,它可以利用双向TLS进行节点之间的身份认证,角色授权和加密传输,并且可以自动执行证书的颁发和更换
- 3:简单:Swarm的操作非常简单,并且除Docker外基本没有其它外部依赖
3:Swarm架构
- Swarm的架构整体分为 管理节点 和 工作节点
- 管理节点
- 管理节点负责接受用户的请求,用户的请求中包含用户定义的容器运行状态描述,然后Swarm负责调度和管理容器,并且努力达到用户所期望的状态
- 工作节点
- 工作节点运行执行器负责执行具体的容器管理任务,例如容器的启动,停止,删除等操作
4:Swarm核心概念
- Swarm集群
- Swarm集群是一组被Swarm统一管理和调度的节点,被Swarm管理的节点可以是物理机或者虚拟机。其中一部分作为管理节点,负责集群状态的管理和协调,另一部分作为工作节点,负责执行具体的任务来管理容器,实现用户服务的启动,停止等功能
- 节点
- Swarm集群中的每一台物理机或者虚拟机称为节点。节点按照工作职责分为管理节点和工作节点。管理节点由于需要使用Raft协议来协商节点状态,生产环境中通常建议将管理节点的数量设置为奇数。
- 服务
- 服务是为了支持容器编排所提出的概念,它是一系列复杂容器环境互相协作的统称,一个服务的声明通常包含容器的启动方式,启动的副本数,环境变量,存储,配置,网络等一系列配置,用户通过声明一个服务,将它交给Swarm,Swarm负责将用户声明的服务实现
- 任务
- 任务是集群中最小的调度单位,它包含一个真正运行中的Docker容器。当管理节点根据服务中声明的 副本数将任务调度到节点时,任务则开始在该节点启动和运行,当节点出现异常时,任务会运行失败。 此时调度器会把失败的任务重新调度到其他正常的节点上正常运行,以确保运行中的容器副本数满足用 户所期望的副本数。
- 服务外部访问
- 由于容器的 IP 只能在集群内部访问到,而且容器又是用后马上销毁,这样容器的 IP 也会动态变化,因 此容器集群内部的服务想要被集群外部的用户访问到,服务必须要映射到主机上的固定端口。Swarm 使用入口负载均衡(ingress load balancing)的模式将服务暴露在主机上,该模式下,每一个服务会 被分配一个公开端口(PublishedPort),你可以指定使用某个未被占用的公开端口,也可以让 Swarm 自动分配一个。
5:搭建Swarm集群
-
准备4台虚拟机
- swarm-manager:192.168.31.100 manager
- swarm-node-1:192.168.31.101 node
- swarm-node-2:192.168.31.102 node
- swarm-node-3:192.168.31.103 node
-
初始化集群
- 在管理节点上,通过以下命令初始化集群
- docker swarm init
-
加入工作节点
- docker swarm join --token SWMTKN-1- 1kal5b1iozbfmnnhx3kjfd3y6yqcjjjpcftrlg69pm2g8hw5vx-8j4l0t2is9ok9jwwc3tovtxbp 192.168.31.100:2377
-
节点查看
- docker node ls
6:结语
- Docker Swarm 是一个用来定义复杂应用的集群编排工具,可以帮我们把多台主机组成一个 Swarm 集 群,并且帮助我们管理和调度复杂的容器服务。由于 Swarm 已经被内置于 Docker 中,因此 Swarm 的 安装和使用也变得非常简单,只要你有 Docker 的使用经验,就可以很快地将你的应用迁移到 Swarm 集群中。