Docker Swarm集群
# Docker swarm集群
1.Docker Swarm简介及集群的作用。
2.实施部署Swarm集群。
# Docker Swarm
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在点击这里, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker。
Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
# Swarm集群中的角色
Swarm
:作用于运行docker engine(引擎)的多个主机组成的集群。node
:每一个docker engine都是一个node(节点),分为manager和worker。manager node
:负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,它们会自动协调并选举出一个Leader执行编排任务。但相反,不能没有manager node。worker node
:接受并执行由manager node派发的任务,并且默认manager node也是一个work node,不过可以将它设置为manager-only node,让它只负责编排和管理工作。service
:用来定义worker上执行的命令。
# 部署Docker Swarm
# 部署前准备
Docker01 | Docker02 | Docker03 |
---|---|---|
Node01 | Node02 | Node03 |
192.168.2.60 | 192.168.2.50 | 192.168.2.80 |
关闭防火墙、禁用selinux、三台dockerhost区别主机名、时间同步。
Docker版本必须是:v1.12版本开始。
$ ntpdate time1.aliyun.com #与阿里云的时间同步,可以使用ntpdate 192.168.2.60与主机时间同步。
systemctl stop firewalld
systemctl disable firewalld
iptables -F
iptables -X
iptables -Z
setenforce 0
安装docker
[docker]
name=docker
baseurl=file:///opt/Docker
gpgcheck=0
enabled=1
$ yum install -y docker-ce
# 开始部署
1.初始化集群,Docker01上:
--token
:令牌,密钥,默认保存24小时。只有24小时有效期。--advertise-addr
:指定其他node通信的地址。
[root@node01 ~]$ docker swarm init --advertise-addr 192.168.2.60
Swarm initialized: current node (pjortjrcrucuihbz6uphl8qnu) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
#当执行完上面的命令时,会返回上面的信息,这些信息提示信息给出的是,如果其他节点需要加入此节点,需要执行的命令,直接复制,对其主机执行即可加入集群。如果想要添加work节点运行下面的命令:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
如果想要添加manager节点:运行下面的命令:
[root@node01 ~]$ docker swarm join-token manager
# 加入集群
2.两台docker02和docker03加入集群:
Docker02:
[root@node02 ~]$ docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
This node joined a swarm as a worker.
Docker03:
[root@node03 ~]$ docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-41wghyxhgc8bg9ipctcmw75bx 192.168.2.60:2377
This node joined a swarm as a worker.
当其他两个节点加入成功之后,我们可以在manager node上执行docker node ls 查看节点详情(master节点)
- #这里的*号代表当前所在的节点。
- 可以看出,node01是leader(领导者嘛)
[root@node01 ~]$ docker node ls #这条命令只有manager node可以执行,worker node不可以执行。
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu * node01 Ready Active Leader 18.09.0
045waz9m9j9xfuk3p21nnyl17 node02 Ready Active 18.09.0
jtkz4zp2tp3f9ote21ohwhmgs node03 Ready Active 18.09.0
--------------------------------------------------------------------------
# 添加工作节点
3.将docker02和docker03提升为manager node,然后再将02和03恢复到worker node。
[root@node01 ~]$ docker node promote node02
[root@node01 ~]$ docker node promote node03
[root@node01 ~]$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
pjortjrcrucuihbz6uphl8qnu * node01 Ready Active Leader 18.09.0
1emp6dh2iawsgy8700fdswk5d node02 Ready Active Reachable 18.09.0
39yu0s3ykz21gcphr53j7lp1y node03 Ready Active Reachable 18.09.0
这时候docker02和docker03也是manager node了,也可以使用另一种方法:
首先docker02和docker03申请离开集群:
申请离开一个集群,之后查看节点状态会变成down,然后可以通过manager node将其删除。
Docker02:
[root@node02 ~]$ docker swarm leave
Node left the swarm.
Docker03:
[root@node03 ~]$ docker swarm leave
Node left the swarm.
--------------------------------------------------------------------------
回到docker01的leader上,删除节点:
[root@node01 ~]$ docker node rm node02
node02
[root@node01 ~]$ docker node rm node03
node03
重新生成令牌:docker01上:
[root@node01 ~]$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4zz7hmub1du7b9xtpc57tdo9rd74dci0ly7eaj8fmyjluvurr5-c6ccobdctfzuit8mue3zafe60 192.168.2.60:2377
# 部署网络
4.部署docker swarm集群网络:
overlay
:覆盖型网络
--attachable
:这个参数必须要加,否则不能用于容器。在创建网络的时候,我们并没有部署一个存储服务,比如consul,那是因为docker swarm自带存储。
[root@node01 ~]$ docker network create -d overlay --attachable docker
# swarm可视化
5.部署一个图形化 webUI 界面
镜像可以通过docker pull下载镜像
[root@node01 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockersamples/visualizer latest f6411ebd974c 11 months ago 166MB
[root@node01 ~]$ docker run -d -p 8080:8080 \
-e HOST=192.168.2.60 \
-e PORT=8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name visualizer \
dockersamples/visualizer
然后可以通过浏览器访问验证:IP:8080
这样就可以很清楚的看清节点的信息及状态。
如果访问不到网页,需要开启路由转发,执行下面两条命令:
$ echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p
# Services使用
6.创建services:
[root@node01 ~]$ docker service create --replicas 5 --network docker --name web1 -p 80 nginx:latest
#--replicas:副本数量。
大概可以理解为:一个副本等于一个容器。
查看service:
[root@node01 ~]$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
j0a5resb13r6 web1 replicated 5/5 nginx:latest *:30003->80/tcp
回到网页查看详情:
设置manager node不参加工作:
[root@node01 ~]$ docker node update node01 --availability drain
node01
查看service信息:
[root@node01 ~]$ docker service ps web1
当然还可以增加容器的数量和减少容器的数量:
增加容器:
[root@node01 ~]$ docker service scale web1=8
减少容器:
[root@node01 ~]$ docker service scale web1=3
# 总结
Docker Swarm基础命令总结:
离开集群:
docker swarm leave
删除节点:
docker node rm node02 #这里注意,只有申请离开集群的node才可以删除。
生成令牌,可以是manager身份或worker身份:
docker swarm join-token [manager | worker]
降级为work与升级为manager:
docker node demote(降级):将swarm节点的manager降级为work
docker node promote(升级):将swarm节点的work升级为manager
Service基础命令:
查看service列表:
docker service ls
查看service信息:
docker service ps xxx
增加容器与减少容器:
docker service scale web1=8
docker service scale web1=3 #等号后接容器的数量。
设置manager node不参加工作:
docker node update node01 --availability drain
可以设置三个参数:
active"|"pause"|"drain #活跃”|“暂停”|“不工作