简介
Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,上周五,4月17号,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。下面是Swarm的结构图:
部署Swarm
环境:
CentOS 7
192.168.200.201 Manager
192.168.200.202 Node1
192.168.200.203 Node2
Swarm安装:
docker pull swarm
在使用Swarm进行集群管理之前,需要先把准备加入集群的所有的节点的docker deamon的监听端口修改为0.0.0.0:2375,
方法一:
docker –H tcp://0.0.0.0:2375 &
方法二:
vim /etc/sysconfig/docker OPTIONS='-H tcp://0.0.0.0:2375' //该行原来配置不做修改,追加给出配置。 CentOS 6修改内容为 vim /etc/sysconfig/docker OPTIONS='-H tcp://0.0.0.0:2375 –H unix:///var/run/docker.sock'
重启docker
systemctl restart docker
每台Node都需要安装 swarm
docker pull swarm
创建集群、管理集群
本文采用的是文件的方法,相对于Docker Hub的发现功能,不容易出现TimeOut,且比较简单、方便。
把需要加入到集群的节点的IP地址及端口写进去(Manager也需要)
vim cluster 192.168.200.201:2375 192.168.200.202:2375 192.168.200.203:2375
在Manager(192.168.200.201)执行swarm manage命令
docker run -d -p 2376:2375 -v $(pwd)/cluster:/tmp/cluster swarm manage file:///tmp/cluster
查看状态
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6eb59fe0f577 swarm "/swarm manage fil..." 41 minutes ago Up 41 minutes 0.0.0.0:2376->2375/tcp kind_curran
查看集群Node信息
docker -H 192.168.200.201:2376 info Containers: 6 Running: 6 Paused: 0 Stopped: 0 Images: 4 Server Version: swarm/1.2.9 Role: primary Strategy: spread Filters: health, port, containerslots, dependency, affinity, constraint, whitelist Nodes: 3 (unknown): 192.168.200.201:2375 └ ID: └ Status: Pending └ Containers: 0 └ Reserved CPUs: 0 / 0 └ Reserved Memory: 0 B / 0 B └ Labels: └ Error: Cannot connect to the Docker daemon at tcp://192.168.200.201:2375. Is the docker daemon running? └ UpdatedAt: 2018-06-04T17:39:12Z └ ServerVersion: Node1: 192.168.200.202:2375 └ ID: BCCW:KY4H:SDTO:RE24:DYL6:2WXN:ISFJ:6RMX:INLB:BW7B:4IP5:MF6Q|192.168.200.202:2375 └ Status: Healthy └ Containers: 3 (3 Running, 0 Paused, 0 Stopped) └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1024 MiB └ Labels: kernelversion=3.10.0-693.21.1.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), ostype=linux, storagedriver=overlay2 └ UpdatedAt: 2018-06-04T17:43:29Z └ ServerVersion: 1.13.1 Node2: 192.168.200.203:2375 └ ID: B5T4:MCAS:QDDL:RWTY:4GTX:WN6Y:EG3O:HM4R:GUKR:J7KD:5R7H:GXEI|192.168.200.203:2375 └ Status: Healthy └ Containers: 3 (3 Running, 0 Paused, 0 Stopped) └ Reserved CPUs: 0 / 1 └ Reserved Memory: 0 B / 1024 MiB └ Labels: kernelversion=3.10.0-693.21.1.el7.x86_64, operatingsystem=CentOS Linux 7 (Core), ostype=linux, storagedriver=overlay2 └ UpdatedAt: 2018-06-04T17:43:10Z └ ServerVersion: 1.13.1 Plugins: Volume: Network: Swarm: NodeID: Is Manager: false Node Address: Kernel Version: 3.10.0-693.21.1.el7.x86_64 Operating System: linux Architecture: amd64 Number of Docker Hooks: 3 CPUs: 2 Total Memory: 2 GiB Name: 6eb59fe0f577 Docker Root Dir: Debug Mode (client): false Debug Mode (server): false WARNING: No kernel memory limit support Experimental: false Live Restore Enabled: false Registries:
部署服务
部署Nginx服务,并且将80端口映射到宿主机的81端口上
docker -H 192.168.200.201:2376 run -d -p 81:80 --name web1 nginx
查看
docker -H 192.168.200.201:2376 ps f695ec677fd6 nginx "nginx -g 'daemon ..." 36 minutes ago Up 36 minutes 192.168.200.202:81->80/tcp Node1/web4
Swarm调度算法
Swarm在schedule节点运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
Random顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运行的容器的数量来计算应该运行容器的节点。
在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点(The binpack strategy causes Swarm to optimize for the container which is most packed.)。
使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。
参考文档:http://www.cnblogs.com/rio2607/p/4445968.html
http://dockone.io/article/227