1. 关于swarm
1)集群概念
Swarm这个项目名称特别贴切。在Wiki的解释中,Swarm behavior是指动物的群集行为。比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavior
Swarm项目正是这样,通过把多个Docker Engine聚集在一起,形成一个大的docker-engine,对外提供容器的集群服务。同时这个集群对外提供Swarm API,用户可以像使用Docker Engine一样使用Docker集群
2)swarm集群的特点
- 对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine,则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。
- Swarm对用户来说,之前使用Docker的经验可以继承过来。非常容易上手,学习成本和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资源也非常少。 *“Batteries included but swappable”,简单说,就是插件化机制,Swarm中的各个模块都抽象出了API,可以根据自己一些特点进行定制实现。
- Swarm自身对Docker命令参数支持的比较完善,Swarm目前与Docker是同步发布的。Docker的新功能,都会第一时间在Swarm中体现。
Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(dockerclient in go, docker_py, docker等)均可以直接与Swarm通信,Swarm几乎全部用Go语言来完成开发
3)swarm集群的相关概念
- swarm:集群的管理和编排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm
- node: 一个节点(node)是已加入到 swarm 的 Docker 引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着 Manager管理节点调度任务到 worker 节点,manager 节点还执行维护集群的状态的编排和群集管理功能,worker 节点接收并执行来自manager 节点的任务。通常,manager 节点也可以是 worker 节点,worker 节点会报告当前状态给 manager 节点
- service: 服务是要在 worker 节点上要执行任务的定义,它在worker节点上执行,当你创建服务的时,你需要指定容器镜像
- task: 任务是在 docekr 容器中执行的命令,Manager 节点根据指定数量的任务副本分配任务给 worker 节点
4)docker swarm命令
- docker swarm:集群管理,子命令有 init, join, leave, update。(docker swarm –help 查看帮助)
- docker service:服务创建,子命令有 create, inspect, update, remove, tasks。(docker service–help 查看帮助)
- docker node:节点管理,子命令有 accept, promote, demote, inspect, update, tasks, ls, rm。(docker node –help 查看帮助)
2. swarm集群的实现过程
1)集群准备工作
实验准备
三台已经安装docker的主机
host1 192.168.20.111
host2 192.168.20.112
host3 192.168.20.113
修改host文件
三台都修改
vim /etc/hosts
192.168.20.111 swarm01
192.168.20.112 swarm02
192.168.20.113 swarm03
关闭防火墙
三台都操作
systemctl stop firewalld
systemctl disable firewalld
调整selinux状态
三台都操作
vim /etc/selinux/config
SELINUX=disabled
修改docker监听端口
Swarm是通过监听2375端口进行通信的,所以在使用Swarm进行集群管理之前,需要设置一下2375端口的监听。所有主机节点docker开启2375监听
三台都操作
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
ExecStart这一行改成如上的样子
systemctl daemon-reload
systemctl restart docker
重启虚拟机
reboot
2)集群创建
swarm镜像下载
三台都执行
[root@swarm01 ~]# systemctl start docker
[root@swarm01 ~]# docker pull swarm
Using default tag: latest
latest: Pulling from library/swarm
d85c18077b82: Pull complete
1e6bb16f8cb1: Pull complete
85bac13497d7: Pull complete
Digest: sha256:21ba7705cd79ead9495d5bea3b14a98e70b1e8ec97c35b095e6f8562a3f547ff
Status: Downloaded newer image for swarm:latest
[root@swarm01 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 49f7960eb7e4 12 months ago 200MB
swarm latest ff454b4a0e84 12 months ago 12.7MB
初始化swarm(在swarm01上初始化,默认01就是主)
[root@swarm01 ~]# docker swarm init --advertise-addr 192.168.20.111
Swarm initialized: current node (e77sjyk08w0xu5m4mzy3xicvn) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-47d0p9cg2nxzl94m1coy2jpgdarrfne03zrkcglek1iiw0c4ba-dcchaf3pnvkiyvyf7f03oj704 \
192.168.20.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上边说了,如果想要加入这个节点所在集群,可以执行上述命令,如果想以管理节点身份加入,可以执行
docker swarm join-token manager,然后会提示命令,复制粘贴即可
02和03加入集群
docker swarm join \
--token SWMTKN-1-47d0p9cg2nxzl94m1coy2jpgdarrfne03zrkcglek1iiw0c4ba-dcchaf3pnvkiyvyf7f03oj704 \
192.168.20.111:2377
swarm01查看集群节点
[root@swarm01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st swarm03 Ready Active
e77sjyk08w0xu5m4mzy3xicvn * swarm01 Ready Active Leader
odwl7akqixlumw42m0vfe89ni swarm02 Ready Active
如果想让某个节点上线或者下线,也可以操作(管理节点上敲)
[root@swarm01 ~]# docker node update --availability drain swarm03
swarm03
[root@swarm01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st swarm03 Ready Drain
e77sjyk08w0xu5m4mzy3xicvn * swarm01 Ready Active Leader
odwl7akqixlumw42m0vfe89ni swarm02 Ready Active
[root@swarm01 ~]# docker node update --availability active swarm03
swarm03
[root@swarm01 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
a70qjvr9cgt04g1shge0hd8st swarm03 Ready Active
e77sjyk08w0xu5m4mzy3xicvn * swarm01 Ready Active Leader
odwl7akqixlumw42m0vfe89ni swarm02 Ready Active
如果想离开集群: docker swarm leave -f
如果想把某个节点提升为manager: docker node promote swarm02
到这里,集群初步搭建完成,接下来来进行集群的应用
查看网络模式
[root@swarm01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
51855774c4c8 bridge bridge local
314fee32e64e docker_gwbridge bridge local
1bf48cef4eca host host local
lfnnu7swvljb ingress overlay swarm
ad48f481958e none null local
可以看出,创建集群后,自动创建了overlay网络用于swarm集群通信
下载集群可视化的镜像并运行容器
在swarm01上操作
docker search visualizer
docker pull dockersamples/visualizer
docker images 下载完之后查看,发现三台主机都有visualizer这个镜像,id都相同
docker run -itd -p 8888:8080 -e HOST=192.168.20.111 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualizer dockersamples/visualizer
容器运行起来之后,可以去浏览器访问swarm01的8888端口,查看集群的图形化界面,如下
下面,我们在swarm01上用swarm创建集群用的容器
192 docker service create -d --replicas 1 --name web01 -p 8000:80 httpd
194 docker service create -d --replicas 3 --name web02 -p 8000:80 httpd
--replicas表示容器的个数
效果图如下 如果容器的小圆点是红色的,不要着急,等一等就好了
另外,刚开始的时候,由于容器还不太稳定,所以在主机上docker ps的时候可能看不到
刚创建的容器,等一等就好了
过一会再看,已经好了,如下图
如果觉得容器不想要了,可以去每个主机上进行删除
原则上来说,如果集群有n个节点,–replicas的数量不能大于n,也可以使用mode创建与n相等数量的容器,如下操作:
[root@swarm01 ~]# docker service create -d --mode global --name web04 -p 8005:80 httpd
67tx5tyw2fz7948mtoh1rtpkk
而且这些容器都是可以访问的,以web04为例,结果如下:
我们可以看到,在每个主机上,都有很多容器运行,这个时候有一个疑问:如果主机2宕机,那么它上边的容器是否会消失,下边我们停掉主机2的docker,来看一下结果
由上图,可以看出,如果是replicas的形式创建的,会被转移到其他主机,如果是mode的方式创建的,则不会被转移,我们现在把主机2的docker再次启动起来,看一下变化
可以看到mode方式创建的容器再次恢复,而通过replicas方式创建的容器转移走了之后就没有再回来
如果相对swarm集群的某个容器进行操作,如下操作即可
[root@swarm03 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
941289bf717c httpd:latest "httpd-foreground" 4 minutes ago Up 4 minutes 80/tcp web01.1.y73yw98ddlqderpsc5hqpfcfu
83e5e449b59b httpd:latest "httpd-foreground" 9 minutes ago Up 9 minutes 80/tcp web04.a70qjvr9cgt04g1shge0hd8st.aat085ibidjo80h6xcqcbyma3
ef5e02f94caf httpd:latest "httpd-foreground" 21 minutes ago Up 21 minutes 80/tcp web02.3.bfzcvu69u4kj0h11ktnlmoxx3
[root@swarm03 ~]# docker exec -it web01.1.y73yw98ddlqderpsc5hqpfcfu /bin/bash
root@941289bf717c:/usr/local/apache2# ls
bin build cgi-bin conf error htdocs icons include logs modules
root@941289bf717c:/usr/local/apache2#