Docker容器虚拟化技术—Docker运维管理(Swarm集群管理)3
Swarm集群管理
docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台。
基于Go语言实现。它的架构如下:
1 Swarm的核心概念
1.1 集群
一个集群由多个 Docker 主机组成,这些Docker主机以集群模式运行,并充当管理者(用于管理成员资格和委派)和工作人员(运行集群服务)
与独立容器相比,集群服务的主要优势之一是,可以修改服务的配置,包括它所连接的网络和卷,而无需手动重新启动服务。
独立容器和集群服务之间的主要区别在于,只有集群管理器可以管理集群,而独立容器可以在任何守护程序上启动。
1.2 节点
swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker
manager节点
Docker Swarm集群需要至少一个manager节点,节点之间使用 Raft consensus protocol 进行协同工作。 通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。
当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。 每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用
worker节点
worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。 worker节点之间,通过 control plane 进行通信,这种通信使用 gossip 协议,并且是异步的
1.3 服务和任务
集群中的stacks, services, tasks的关系,如下图:
services(服务)
swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:
- 服务名称
- 使用哪个镜像来创建容器
- 要运行多少个副本
- 服务的容器要连接到哪个网络上
- 应该映射哪些端口
task(任务)
在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系
stack(栈)
stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack
1.4 负载均衡
集群管理器使用入口负载平衡将要从集群外部获取的服务公开给集群。
集群管理器可以自动为服务分配一个已发布端口,也可以为该服务配置一个已发布端口。
可以指定任何未使用的端口。如果未指定端口,则集群管理器会为服务分配 30000-32767 范围内的端口。
集群模式具有一个内部DNS组件,该组件自动为群集中的每个服务分配一个DNS条目。
集群管理器使用内部负载平衡根据服务的DNS名称在群集内的服务之间分配请求。
2 Swarm安装
对于Docker 1.12+版本,Swarm相关命令已经原生嵌入到了Docker Engine中
2.1 下载镜像
docker pull swarm
docker images
2.2 查看版本
# 查看版本
docker run --rm swarm -v
3 Swarm集群
3.1 创建新集群
docker swarm init --advertise-addr 192.168.80.60
上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输 出包含了其它节点如何加入集群的命令。
# 将节点强制驱除集群
docker swarm leave --force
3.2 查看集群状态和节点信息
docker info
docker node ls
3.3 添加工作节点到集群
创建了一个swarm集群与管理器节点,就可以添加工作节点。
- 新创建虚拟机dockerManager
- 在工作节点192.168.80.70上安装docker和docker swarm
在工作节点192.168.80.70上添加工作节点到集群命令:
docker swarm join --token SWMTKN-1-0i3j7ach1qm8feoewpka6lg84judwrzt5z762hhn9a40dq5xj2-56blivoil7tr4dgef1vwcwglf 192.168.146.60:2377
如果忘记了token的值,在管理节点192.168.80.60上执行下述命令(在管理节点上运行)
docker swarm join-token manager
docker swarm join-token worker
在管理节点192.168.80.60上查看节点信息(在管理节点上运行)
docker node ls
3.4 发布服务到集群(在管理节点上运行)
在管理节点192.168.80.60上
docker service create -p 80:80 --replicas 2 --name nginx1 nginx
# 参数介绍
-p :端口映射
--replicas:运行实例个数
--name:服务名
nginx : 镜像名称
查看哪些节点正在运行服务(在管理节点上运行)
docker service ps nginx1
停止并删除发布的服务(在管理节点上运行)
docker service rm nginx1
在工作节点上运行的命令
docker ps
3.5 扩展一个或多个服务
docker service scale mynginx=3
docker service ls
docker service ps mynginx
3.6 更新服务
docker service update --publish-rm 80:80 --publish-add 88:80 nginx1
3.7 节点管理
命令名称 | 说明 |
docker node demote | 从群集(swarm)管理器中降级一个或多个节点 |
docker node inspect | 显示一个或多个节点的详细信息 |
docker node ls | 列出群集(swarm)中的节点 |
docker node promote | 从群集(swarm)管理器中升级一个或多个节点 |
docker node ps | 列出在一个或多个节点上运行的任务,默认为当前节点 |
docker node rm | 从群集(swarm)删除一个或多个节点 |
docker node update | 更新一个节点 |
#给工作节点(localhost.localdomain,可以设置主机名更改节点名称)添加worker1标签
docker node update --label-add myworker1 localhost.localdomain
#给工作节点(localhost.localdomain)节点停用
docker node update --availability drain localhost.localdomain
#停止工作节点(localhost.localdomain)
docker systemctl stop docker
#删除工作节点(localhost.localdomain),需要先停止工作节点,才能删除
docker node rm localhost.localdomain
3.8 如果添加工作节点到集群中报错
解决:防火墙没关
管理节点关闭防火墙
工作节点关闭防火墙,重新加入swarm集群