Docker Swarm简介
Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。
Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。
Swarm可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。
Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。
Docker Swarm 优点
任何规模都有高性能表现
灵活的容器调度
服务的持续可用性
和 Docker API 及整合支持的兼容性
Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持。
docker swarm 相关概念
节点分为管理 (manager) 节点和工作 (worker) 节点
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。
Docker Swarm实践
实验环境: server1作为私有仓库 server234作为节点集群 (harbor私有仓库和集群相结合)
首先清理实验环境 确保没有其他容器 保持本次实验环境干净
执行./install.sh脚本可自动拉起集群

[root@server1 harbor]# docker-compose ps 列出所有容器

创建 Swarm 集群
root@server2 ~]# docker swarm init 初始化集群
根据提示在其他docker节点server3 server4上执行命令:
[root@server2 ~]# docker node ls 查看swarm集群节点

将server2上的 demo json文件和demo json证书发送给server3 server4


此次报错是由于重启电脑之后原来配置的参数值就会丢失,而系统每次启动时都会自动去/etc/sysctl.conf文件中读取内核参数 此次解决需要修改内核参数
[root@server3 sysctl.d]# sysctl -a|grep bridge-nf-call-iptables 过滤内核选项
[root@server3 sysctl.d]# vim /etc/sysctl.d/docker.conf 创建docker.conf文件 打开桥接![]()
[root@server3 sysctl.d]# sysctl --system 使之生效
[root@server3 sysctl.d]# docker info 查看docker的详细信息 没有报错
server4上此次也会出现跟server3上一样的报错 解决方法也是一样的 将server3上的docker.conf文件发送到server4上的./etc/sysctl.d/路径下此时 sysctl --system 使之生效即可解决报错

![]()



server3和server4上同时添加解析![]()

![]()

此次拉取镜像会出现报错 harbor所有的数据都存在/data目录下 清除掉仓库的所有数据包括镜像
![]()



重新上传镜性 此时sever4上拉取镜像成功 并从私有仓库拉取速度很快

测试仓库与我们的集群节点连通性顺畅



在管理端server2是检测集群节点状态是否ok
创建集群服务
命令行的方式进行部署
命令解释: docker service create 命令创建一个服务
--name 服务名称命名为 my_cluster
--network 指定服务使用的网络模型
--replicas 设置启动的示例数为3 副本数

设置副本数为3 server2 3 4 上边各分配一个容器

访问集群当中任何节点都可以访问并且实现负载均衡


为了能看出实验效果 为服务换个镜像

从外网上拉取镜像myapp1和2

将下载下来的镜像打标签扔到私有仓库 让整个集群下载镜像时从私有仓库下载 速度会加快

访问集群当中的任何节点都可以实现负载均衡
弹性伸缩
[root@server2 docker]# docker service scale webservice=6 拉伸服务的副本数 平均每个主机上开2个 



[root@server2 docker]# docker service ps webservice 查看不同的容器运行在哪个节点上并且自动的实现负载均衡


[root@server2 docker]# docker service scale webservice=3 缩减服务的副本数
[root@server2 docker]# docker service rm webservice 删除集群服务
总结:docker swarm相比kubernetes、mesos项目,还是显得单薄,更加适合小wq规模docker集群。
部署swarm监控:(各节点提前导入dockersamples/visualizer镜像) 集群配置图像化

从外网拉取镜像并上传到私有仓库

docker service create 命令创建一个服务


浏览器访问172.25.15.2 8080 端口

可以看到每个节点都有一个容器
拉伸



压缩

滚动更新
docker service update --image myapp:v2 --update-parallelism 2 --update-delay 2s webservice
--image 指定要更新的镜像 --update-parallelism 指定最大同步更新的任务数 --update-delay 指定更新间隔 每次更新两个容器中间间隔两秒钟

![]()
rollback 回滚 (一个一个在回滚)容器回滚

假设server3上的docker引擎出问题



server3上的容器出现问题后 它的容器会均衡到其他的节点上 容器总数不变

恢复server3上的容器 查看容器并没有均衡到server3上
![]()

容器拉伸
当拉伸到20个时 会发现sever3上的容器均衡过来


容器回缩


用文件的方式部署节点容器



--deploy 部署参数
删除节点上的容器
节点的升降
将server3的节点作为一个master也就是leader server3处于备份状态
将server2将级 server3自动升级

集群如何删除![]()
![]()
在server3leader可看到server2 4已经删除
在server3上删掉离开的节点

根据提示在其他docker节点server3 server4上执行命令:
