docker swarm :

Swarm 是 Docker 公司在 2014 年 12 月初发布的一套较为简单的工具,用来管理 Docker 集群,它将一群 Docker 宿主机变成一个单一的,虚拟的主机。Swarm 使用标准的 Docker API接口作为其前端访问入口,换言之,各种形式的 Docker Client(docker client in go, docker_py,docker 等)均可以直接与 Swarm 通信。Swarm 几乎全部用 Go 语言来完成开发。

Swarm deamon 只是一个调度器(Scheduler)加路由器(router),Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。下面是 Swarm 的结构图

Swarm和Kubernetes比较类似,但是更加轻量,具有的功能也较kubernetes更少一些。

docker swarm的调度算法_nginx

 

Swarm 启动的过程包含三个步骤:
发现 Docker 集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;初始化内部调度(scheduler)模块;
创建并启动 API 监听服务模块;
第一个步骤,Swarm 发现 Docker 集群中的节点。发现(discovery)是 Swarm 中用于维护Docker 集 群 状 态 的 机 制 。 既 然 涉 及 到 发 现 ( discovery ) , 那 在 这 之 前 必 须 先 有 注 册(register)。Swarm 中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的 discovery 模式下,注册(register)也会有不同的形式

第二个步骤,Swarm 内部的调度(scheduler)模块被初始化。swarm 通过发现机制发现所有注册的 Docker Node,并收集到所有 Docker Node 的状态以及具体信息。此后,一旦Swarm 接收到具体的 Docker 管理请求,Swarm 需要对请求进行处理,并通过所有 DockerNode 的状态以及具体信息,来筛选(filter)决策到底哪些 Docker Node 满足要求,并通过一定的策略(strategy)将请求转发至具体的一个 Docker Node。

第三个步骤,Swarm 创建并初始化 API 监听服务模块。从功能的角度来讲,可以将该模块抽象为 Swarm Server。需要说明的是:虽然 Swarm Server 完全兼容 Docker 的 API,但是有不少 Docker 的命令目前是不支持的,毕竟管理 Docker 集群与管理单独的 Docker 会有一些区别。当 Swarm Server 被初始化并完成监听之后,用户即可以通过 Docker Client 向 Swarm发送 Docker 集群的管理请求。

实验环境:
172.25.45.1         swarm manager
172.25.45.2         swarm worker
172.25.45.3         swarm worker

一、搭建集群

1.三个7.3的虚拟机,分别安装:

yum install -y docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
               docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm

docker swarm的调度算法_nginx_02

docker swarm的调度算法_docker swarm的调度算法_03

2.在三台虚拟机上打开docker

systemctl start docker.service

3.在三台主机上安装

root@server1 ~]# yum install -y bash-*    #下载后需要退出再次登陆
[root@foundation45 ~]# ssh root@172.25.45.1

4.在server1上做初始化(黑色部分为别的swarm想要加入执行的命令)

[root@server1 ~]# docker swarm init

docker swarm的调度算法_docker_04

5.在server2和server3上做初始化,是为了加入server1的集群中(执行上边黑色部分内容)

docker swarm的调度算法_docker swarm的调度算法_05

docker swarm的调度算法_nginx_06

在server1中查看节点:

[root@server1 ~]# docker node ls

docker swarm的调度算法_docker_07

6.在server1上导入nginx的镜像并创建集中管理

docker load -i nginx.tar(server2和server3也要做)  # 加载nginx的docker镜像 
docker service create --name nginx --publish 80:80 --replicas 3 nginx 
#创建一个名称为web,副本为3,开放端口为80的nginx服务
docker service ps nginx                 # 保证server1,2,3上均有running的nginx

docker swarm的调度算法_docker swarm的调度算法_08

7.编辑默认发布目录,写入复制到nginx容器下

在server1中:

[root@server1 ~]# vim index.html
[root@server1 ~]# cat index.html 
<h1>server1 swarm</h1>
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e0a0dbce718d        nginx:latest        "nginx -g 'daemon ..."   44 minutes ago      Up 44 minutes       80/tcp              nginx.4.o11xb1c7q41v1ikp4za99xaam
[root@server1 ~]# docker container cp index.html e0a0dbce718d:/usr/share/nginx/html
#将文件拷贝到nginx的发布目录下

在server2中:

[root@server2 ~]# vim index.html
[root@server2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
48ba252a37cd        nginx:latest        "nginx -g 'daemon ..."   46 minutes ago      Up 46 minutes       80/tcp              nginx.5.jk6e7jld44nv02k7f6pvbs15w
[root@server2 ~]# cat index.html 
<h1>server2 swarm</h1>
[root@server2 ~]# docker container cp index.html 48ba252a37cd:/usr/share/nginx/html

在server3上:

[root@server3 ~]# vim index.html
[root@server3 ~]# cat index.html 
<h1>server3 swarm</h1>
[root@server3 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2a0bdc1f003c        nginx:latest        "nginx -g 'daemon ..."   51 minutes ago      Up 51 minutes       80/tcp              nginx.2.omhxgeaewtxubry0cab1c5g9w
[root@server3 ~]# docker container cp index.html 2a0bdc1f003c:/usr/share/nginx/html

测试负载均衡:172.25.45.1

docker swarm的调度算法_Docker_09

8.scale参数:

其可以调整容器副本的个数

[root@server1 ~]# docker service scale nginx=6
[root@server1 ~]# docker service ps nginx
[root@server1 ~]# docker service ls

docker swarm的调度算法_docker_10

docker swarm的调度算法_docker swarm的调度算法_11

二、visualizer图形监控

1.导入镜像

root@server1 ~]# docker load -i visualizer.tar

docker swarm的调度算法_nginx_12

2.完成后创建服务

[root@server1 ~]# docker service create --name=viz --publish=8080:8080/tcp --constraint=node.role==manager 
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock dockersamples/visualizer
[root@server1 ~]# docker service ls

docker swarm的调度算法_docker_13

3.在浏览器访问:

172.25.45.1:8080

docker swarm的调度算法_docker swarm的调度算法_14

4.在机器上的操作可以实时用图形来监控,将nginx更新为game2048

[root@server1 ~]# docker service update --image game2048 --update-parallelism 2 --update-delay 10s nginx
#每10秒更新一次,一次更新2个
[root@server1 ~]# docker service ls

docker swarm的调度算法_docker swarm的调度算法_15

docker swarm的调度算法_docker_16