一、Docker Swarm 简介
Docker Swarm是Docker官方三剑客项目之一,提供Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。
使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。
Docker 1.12.0+Swarm mode已经内嵌入Docker引擎,成为了docker子命令docker swarm
,绝大多数用户已经开始使用Swarm mode,Docker引擎API已经删除Docker Swarm。
二、基本概念
Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具,使用 Swarm 集群之前需要了解以下几个概念。
1、节点
运行Docker的主机可以主动初始化一个Swarm集群或者假如一个已经存在的Swarm集群,这样这个运行Docker的主机就成为Swarm集群的节点(node)。
节点分为管理(manager)节点和工作(worker)节点。管理节点用于Swarm集群的管理,docker swarn
命令基本只能在管理节点执行;工作节点是任务执行节点,管理节点将服务(service)下发至工作节点执行。
集群中管理节点与工作节点的关系如下图所示:
一个Manager可以管理对接多个Worker,同时为了防止Manager的单点故障,部署多个Manager搭建集群,这样就可以构建高可用的docker swarm集群。
2、服务和任务
任务(Task):Swarm中的最小调度单位,目前来说就是一个单一的容器。
服务(Services):一组任务的集合,服务定义了任务的属性。
服务有两种模式:
-
replicated services
:按照一定规则在各个工作节点上运行指定个数的任务。 -
global services
:每个工作节点上运行一个任务
两种模式通过docker service create
的--mode
参数指定。
容器、任务、服务的关系如下图所示:
以nginx服务为例,管理节点定义了该服务由三个节点组成,管理节点将任务下发到三个可用的工作节点,工作节点上的任务又创建了nginx容器来处理实际的请求,总结地说,就是任务创建容器,服务管理任务。
三、初始化集群
使用docker swarm init
在本机初始化一个Swarm集群。
docker swarm init --advertise-addr 服务器IP
如果Docker主机有多个网卡,拥有多个IP,必须使用--advertise-addr
指定IP,执行docker swarm init
命令的节点自动成为管理节点。
下面演示创建一个包含一个Manager、两个Worker的最小Swarm集群(这里我用的是三台VM Ware虚拟机,centos [192.168.27.135]
作为Manager,两台ubuntu [192.168.27.133/134]
作为worker)。
1、创建管理节点
centos的IP固定为192.168.27.135
,故使用以下命令创建管理节点:
docker swarm init --advertise-addr 192.168.27.135
创建成功出现如下信息,此时已经创建好了swarm集群的管理节点,如果想让另外两台机器假如该集群,需要执行黑色背景的命令。
使用
docker node ls
可以看到集群中的节点数和节点管理状态,可以看到刚才加入的本地节点,并且节点状态为Leader,表明这是个管理节点2、创建工作节点
使用以下命令创建工作节点,加入(1)中创建的集群中:
docker swarm join --token SWMTKN-1-5vkw4fbx383l9h9nvjjk2nkmtmir4soizwwq3ozsb4xxy0djmc-dpmdmtgtaky4cocas4ld8eb9v 192.168.27.135:2377
但是发生报错
有可能是被管理节点服务器的防火墙挡住了,先关闭centos的防火墙
systemctl status firewalld.service # 查看防火墙状态
systemctl stop firewalld.service # 停止防火墙
重新在ubuntu尝试加入swarm集群,成功加入集群
有的时候,我们想再次给集群加入工作节点,但是已经忘了token,可以在管理节点服务器上执行以下命令再次获取:
docker swarm join-token manager
token具有时效性,所以过了一定时间重新生成时,token会变化
3、查看集群
docker node ls
在管理节点所在服务器再次查询节点列表
在另外一台ubuntu也执行加入集群命令,最终在centos查询节点列表可以看到有三个节点,这样就构成了由一个管理节点、两个工作节点构成的最简单的swarm集群。
节点MANAGER STATUS列说明:
显示节点是属于manager或者worker,没有值 表示不参与群管理的工作节点。
- Leader 意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
- Reachable 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
- Unavailable 意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
节点AVAILABILITY列说明:
显示调度程序是否可以将任务分配给节点
- Active 意味着调度程序可以将任务分配给节点。
- Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
- Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。
4、增加集群管理节点
为了避免单点故障,通常也需要有多个管理者节点构成集群提高可用性,可以通过以下命令将工作节点升级为管理节点:
docker node prompte [工作节点hostname]
可以看到,执行了升级操作的节点ubuntu2,管理者状态变成了Reachable
(可达的),意思是假如集群中的管理节点宕机时,ubuntu2有能力被选举为管理节点,但是在正式被选举之前它依然是个工作节点,所以这个升级更多地是个授权预备役的作用。
为了保障集群的高可用,将ubuntu也升级为
Reachable
,最终集群状态5、删除节点
docker node rm [hostname/ID]
直接删除报错,要求在移除节点前要先降级
节点降级命令为:
docker node demote [hostname/ID]
再次删除报错,因为节点状态还是活跃的
必须停止该节点上的docker服务,或者被删除节点主动离开集群,才允许删除
如果管理节点主动离开,则整个集群会直接解散,从上图中可以看出,管理节点并不是固定的,可能过一段时间其他可达节点可能会被选举为管理节点,在ubuntu2上执行离开集群命令,由于是管理节点,所以必须加上
--force
参数强制离开6、节点离群
# 工作节点离群
docker swarm leave
# 管理节点离群
docker swarm leave --force
四、部署服务
使用docker service
命令来管理Swarm集群中的服务,该命令只能在管理节点
运行。
1、新建服务
在创建好的Swarm集群中运行一个名为nginx服务
docker service create --replicas 3 -p 80:80 --name nginx nginx:latest
命令很简单,创建3
个副本,端口映射为容器80
端口对应节点的80
端口,容器命名为nginx
,使用官方的nginx:latest
镜像。
2、查看服务
使用以下命令查看当前Swarm集群运行的服务
docker service ls
使用以下命令来查看某个服务的详情
docker service nginx
查看具体服务的每个副本
docker service ps nginx
使用以下命令来查看某个服务的日志
docker service logs nginx
3、删除服务
使用以下命令从Swarm集群移除某个服务
docker service rm nginx
4、操作演示
新建服务
查看服务
查看具体服务的每个副本
查看服务日志,由于还没访问nginx,所以没有产生日志
访问所有节点上的服务,服务均正常
再次查看日志
停止服务
再次浏览器访问,所有节点都无响应
五、资源管理
上面演示了利用Docker Swarm快速搭建一个最小集群,也可以在集群上部署服务,但发现swarm并没有提供同意入口查看节点的资源使用情况,这时我们非常希望有一个图形化管理工具来帮我们管理swarm集群,portainer
就是这样的一个工具。
Portainer是Docker的图形化管理工具,提供状态显示面板、用户模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像、创建容器等)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
1、portainer集群运行
(1)下载portainer镜像
# 查询当前有那些Portainer镜像
docker search portainer
# 拉取Portainer镜像
docker pull portainer/portainer
(2)安装portainer
docker run -d -p 9000:9000 \
--name portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
portainer/portainer
(3)portainer配置
通过http://IP:9000
访问portainer,进入首页,设置管理员账号密码
配置完后进入下面界面,因为将portainer部署在管理节点所在服务器上,选择Local,连接
可以看到有两个服务栈(通过compose创建),7个容器2个启动5个停止,7个数据卷,24个镜像
(4)portainer面板信息
点击local,可以在左侧看到非常多的容器相关信息,包括镜像、服务栈、集群、容器、节点等。
Swarm集群
容器
镜像
数据卷
网友评论