docker-swarm集群部署
一、swarm介绍
Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群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 来进行服务发现配置了。
二、Docker 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上执行的命令。
三、swarm集群部署
1.环境
节点1:node1 192.168.172.128
节点2:node2 192.168.172.131
节点3:node3 192.168.172.132
2.免密登录
[root@localhost ~]# cat /etc/hosts ##三台机子都需要做 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.172.128 node1 192.168.172.131 node2 192.168.172.132 node3
[root@localhost ~]# ssh-keygen -t rsa ##三台机子都需要做
[root@localhost ~]# ssh-copy-id -i 192.168.172.131 [root@localhost ~]# ssh-copy-id -i 192.168.172.132
3.开启允许的端口
firewall-cmd --add-port={2377,7946,4789}/tcp --permanent firewall-cmd --add-port={7946,4789}/udp --permanent firewall-cmd --reload
4.构建一份私有仓库
(1):
[root@localhost ~]# docker pull registry:2 [root@localhost ~]# docker run -dit -p 5000:5000 --restart always -v /opt/data/registry/:/var/lib/registry --name registry registry:2
(2):
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd --insecure-registry=192.168.172.128:5000 -H fd:// --containerd=/run/containerd/containerd.sock
(3):
systemctl daemon-reload
systemctl restart docker
(4):
docker tag httpd:latest 192.168.172.128:5000/httpd docker tag busybox:latest 192.168.172.128:5000/busybox
(5):
docker push 192.168.172.128:5000/httpd:latest docker push 192.168.172.128:5000/busybox:latest
(6):
curl 192.168.172.128:5000/v2/_catalog
5.初始化docker swarm
docker swarm init --advertise-addr 192.168.172.128
把另外两台节点加入
[root@localhost ~]# docker swarm join --token SWMTKN-1-1i55rke1jsi0fg3fwa8ade1elfi9gy572j9rknvb5ltv0etdm3-extg6rkqfvaso1vhcped5z4kn 192.168.172.128:2377 This node joined a swarm as a worker. #在另外两个节点上操作
查看节点有哪些:
[root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION wl9tv3om7ubbfzupl65lovdu3 * node1 Ready Active Leader 19.03.12 hv3mxu6u7l7ei2h565c52yuf2 node2 Ready Active 19.03.12 35rbxdx15fmiu3v7q9xngpvpr node3 Ready Active 19.03.12
把node2加入/踢出为manager node
docker node promote node2 (加入)
docker node demote node2 (踢出)
6、添加可视化工具
[root@localhost ~]# docker pull dockersamples/visualizer
[root@localhost ~]# docker tag dockersamples/visualizer:latest 192.168.172.128:5000/dockersa
[root@localhost ~]# docker push 192.168.172.128:5000/dockersamples/visualizer:latest
docker run -dit -p 8888:8080 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock 192.168.172.128:5000/dockersamples/visualizer:latest
创建swarm服务:
[root@localhost ~]# docker service create --name web1 192.168.172.128:5000/httpd
查看:
[root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS q7nb1cpvvgqn web1 replicated 1/1 192.168.172.128:5000/httpd:latest
服务的伸缩:
把服务增加到5个:
[root@localhost ~]# docker service scale web1=5
docker service scale web_server=3 ##减少到3个
模拟节点故障,down掉node2,可以发现服务转移