Docker Swarm

什么是DockerSwarm

Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker

Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。

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

Swarm工作模式

官方介绍:https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

Docker Engine 1.12引入了swarm模式,使您可以创建一个或多个Docker Engine集群,称为swarm。一个群集由一个或多个节点组成:以群集模式运行Docker Engine 1.12或更高版本的物理机或虚拟机。

所有操作都在Manger上,Worke只是负责工作

10台以上的集群,建议使用 K8S
10台一下的集群,建议使用 Swarm

manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持

一、Node

二、Service

三、任务与调度

四、服务副本与全局服务

环境准备

一、配置并启动系统

通过VMware启动四台Centos7系统,其Ip分别为图中所示:

四台虚拟机的配置都是如下:

二、修改主机名

  • IP:192.168.0.103 主机名:manager103 担任角色:swarm manager
  • IP:192.168.0.104 主机名:manager104担任角色:swarm manager
  • IP:192.168.0.106 主机名:node106 担任角色:swarm node
  • IP:192.168.0.107 主机名:node107 担任角色:swarm node
1) 修改主机名
# 192.168.0.103  主机上执行
[root@centosTest ~]# hostnamectl set-hostname manager103
 
# 192.168.0.104  主机上执行
[root@centosTest ~]# hostnamectl set-hostname manager104
 
# 192.168.0.106  主机上执行
[root@centosTest ~]# hostnamectl set-hostname note106

# 192.168.0.107  主机上执行
[root@centosTest ~]# hostnamectl set-hostname note107

三 、设置防火墙

设置所有系统的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。

# 开启防火墙端口
$ firewall-cmd --zone=public --add-port=2377/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/tcp --permanent
$ firewall-cmd --zone=public --add-port=7946/udp --permanent
$ firewall-cmd --zone=public --add-port=4789/udp --permanent
# 重启防火墙生效
$ systemctl restart firewalld
# 查看开放的端口
$ firewall-cmd --list-ports

四台系统安装Docker

使用 MobaXterm 工具操作 SSH,笔者这里使用的是免费版。

安装好 MobaXterm 后,启动四台Centos7会话

启动同步键盘操作

可以在多个窗口展示相同命令操作

Docker安装教程,请参考此处:

安装Docker后,必须配置Docker的镜像加速,笔者这里墙裂推荐选择阿里云镜像加速

检查四台Centos7系统是否安装Docker成功

$ docker version

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查看帮助)
docker swarm join-token manager创建管理节点
docker swarm join-token worker创建工作节点

搭建Swarm集群

一、创建管理节点

[root@manager103 ~]# docker swarm init --advertise-addr 192.168.0.103
[root@manager103 ~]# docker swarm join-token manager
[root@manager104 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-0t26bqb4u285ia3s2w1a9rtfy 192.168.0.103:2377

二、创建工作节点

工作节点106设置

[root@node106 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-dgr8g9p67pvepuq7fur03g7ld 192.168.0.103:2377

工作节点107设置

[root@node107 ~]# docker swarm join --token SWMTKN-1-1kq7dkd0bgnnfaoyd6l521tlvu5w6kbt24y832q6s9nz8d0q2k-dgr8g9p67pvepuq7fur03g7ld 192.168.0.103:2377

三、查看集群启动状况

[root@manager103 ~]# docker node ls

四、更改节点状态

swarm集群中node的availability状态可以为 active或者drain,其中:
active状态下,node可以接受来自manager节点的任务分派;
drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)

[root@manager103 ~]# docker node update --availability drain node104               # 将node104节点下线。如果要删除node104节点,命令是"docker node rm --force node104"

如上,当node104的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。
再次修改为active状态(及将下线的节点再次上线)

[root@manager103 ~]# docker node update --availability active node104

Raft协议

Raft协议:保证大多数节点存活才可以用。只要 > 1,集群至少大于等于3台!

体验Swarm

一、启动服务

# 在管理节点,执行服务排列 
[root@manager103 /]# docker service create -p 8888:80 --name my-nginx nginx

docker run 容器启动,不具有扩缩容器!

docker service 集群服务,具有扩缩容器,滚动更新!

设置集群副本数量

动态扩缩容

# 设置集群副本数量一共10个
$ docker service update --replicas 10 my-nginx
# 简写
$ docker service scale my-nginx=10

二、查看服务启动概况

# 查看集群服务下,指定容器服务
$ docker service ps my-nginx
# 查看集群服务下,所有服务
$ docker service ls

集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!

三、页面访问测试

四、移除集群服务

[root@manager103 /]# docker service rm my-nginx

概念总结

一、Swarm

集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

二、Node

一个节点是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。

要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。
Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。


工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。

代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。

三、Service

一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。

四、Task

任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇