1、前言
上篇文章中我们讲到了Docker Compose来作为服务编排的工具,而Docker Compose只是用于单个宿主机上创建多个容器而进行服务编排的工具;而实际大型集群项目中,会面临多个服务器或宿主机上创建容器,从而组成集群提供相应的服务,而这时候就需要另一个服务编排工具Docker Swarm。
2、Docker Swarm体系架构
2.1、简单介绍
Docker Swarm是Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 宿主机抽象为一个整体,并通过一个入口统一管理这些 Docker 宿主机上的各种 Docker 资源。
Docker Swarm和Kubernetes 比较类似,但是它更加轻量级,且有的功能较 Kubernetes 少一些。有了Docker Swarm 集群,便可以实现应用的负载均衡与失败迁移功能。
Dockere 1.12.0版本开始,已经将Docker Swarm集成了,因此要使用他无需单独安装。而Docker Swarm本身内置了服务发现功能,因此也无需进行服务发现配置。
2.2、体系架构
Docker Swarm 集群是一个主从架构。其中有一个Swarm Manager 节点用来管理集群中的容器资源。Swarm Manager 节点对外暴露操作的接口,外部的用户可以通过该接口来实现对集群的管理。用户也可以通过 Swarm Manager 节点向集群发出操作指令。对于较大规模的 Docker 集群,可以将 Swarm Manager 单独部署到一台服务器上,从而提高其性能。Swarm Node 节点从 Swarm Manager 节点接收命令,从而创建相应的容器来运行应用。但是,用户只能笼统地向集群发出指令,而不能具体分配某台服务器干什么(这是由Swarm Manager节点上的Scheduler调度器完成的)。
3、简单使用
3.1、环境准备
准备3台虚拟机:
- Master:安装了Docker 1.13.1,IP地址为:192.168.74.132
- Node1:安装了Docker 1.13.1,IP地址为:192.168.74.133
- Node2:安装了Docker 1.13.1,IP地址为:192.168.74.134
3.2、初始化master节点
先在master节点上初始化集群:
docker swarm init --listen-addr 192.168.74.132:8888 --advertise-addr 192.168.74.132
- --listen-addr:集群暴露给外部调用的Http API的socket地址。
- --advertise-addr:当宿主机有多网卡时,该参数用于指定绑定的网卡地址。
启动成功后,如上图所示。如果已经启动成功的,可以通过命令查看这部分信息:
docker swarm join-token manager
3.3、建立worker节点
将Node1和Node2节点作为worker加入Swarm集群:
docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888
这里需要用到master节点的token,IP地址,和端口。
建立过程中可能遇到的问题:
- 问题1、--cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode
[root@192 pengyaohuang]# docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888
Error response from daemon: --cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode
解决办法:检查docker配置文件是否配置了远程访问或者注册中心等配置,删除即可。我这边是因为前面配置了zookeeper相关信息导致。
- 问题2、can't initialize raft node
[root@192 pengyaohuang]# docker swarm join --token SWMTKN-1-44rfzzzo532rkk6s9oi1eipmbuqa6f5lcz6nif4y41ynbggnh4-095o1oqhivebg57dtuwim6mep 192.168.74.132:8888
Error response from daemon: can't initialize raft node: rpc error: code = 2 desc = could not connect to prospective new cluster member using its advertised address: rpc error: code = 14 desc = grpc: the connection is unavailable
解决办法:查看防火墙是否开启。关闭防火墙即可:
systemctl stop firewalld
节点加入成功后的提示:
3.4、查看集群的节点信息
在master节点上查看集群节点信息:
docker node ls
可以看到分别有3个节点,2个节点为Reachable状态,一个为Leader状态。而Leader状态的节点ID后带了*号,这个表示该节点为master节点。
这里需要注意的是,master节点也作为worker节点。因此这里总共是有1个master节点,3个worker节点。
到此基本的集群环境就已经构建完成了。
3.5、部署应用
集群环境构建完成后,我们开始部署应用。
3.5.1、创建Dockerfile文件
[root@192 docker_swarm]# vim Dockerfile
FROM nginx
RUN echo '<h1> My first Swarm demo, version: 1</h1>' > /usr/share/nginx/html/index.html
3.5.2、构建镜像
# 1表示我们的版本号
# 等下要上传到我们的docker hub上,因此这里镜像加上我们的仓库名
docker build -t pengyaohuang/swarm_nginx_demo:1 .
3.5.3、将镜像上传到Docker仓库
登录Docker Hub。
docker login
输入账号密码后,就提示登录成功。
将镜像上传到仓库中。
docker push pengyaohuang/swarm_nginx_demo:1
这样,就上传成功啦。
而仓库上也有了我们刚推上去的镜像。
3.5.4、Swarm集群中部署应用
docker service create -p 8080:80 --replicas 3 --name swarm_demo pengyaohuang/swarm_nginx_demo:1
这里参数表示:
- -p: 端口映射,这里将容器80端口映射到宿主机8080端口
- --replicas:副本数量,即启动的容器数量,这里启动3个
- --name:容器名称
3.5.5、查看服务信息
# 查看部署的服务列表
docker service ls
# 查看服务的详细信息
docker service ps
由于我这里集群错误了一个节点,因此这里只能看到2个副本。具体失败原因,还有待查看。
3.5.6、访问地址
浏览器访问地址:http://192.168.74.192:8080,查看效果:
可以看到,就算我们的Node2节点部署失败了,我们整个项目依然是可以正常访问。这也就说明了集群的高可用。
3.5.7、动态伸缩
使用docker swarm我们还可以动态的对我们的服务进行扩容和缩容。如以下命令,我需要将当前容器的副本改为5:
docker service scale swarm_demo=5
也可以减少为1:
docker service scale swarm_demo=1
还是很方便的。
版权归原作者 有一只柴犬 所有, 如有侵权,请联系我们删除。