八. 用Docker Swarm构建主机集群

In most cases, you’ll want redundancy for your app so that if the server hosting it goes down, another server can take over; and you’ll want the ability to scale so that multiple servers can all run the app and share the workload between them. Docker has native support for that with Docker swarm mode, which lets you join multiple machines running Docker into a cluster that provides scale and redundancy.

  • 在一个集群里面,你可以指定运行多少容器,在你向swarm发送请求时,基于资源可用情况, Docker决定哪些主机会实际运行这个容器。
  • 你可以往一个运行的swam里面加入新容器,或者从中删除容器。
  • Swarm支持Networking功能,这意味着里面的所有容器可以互相通讯。
  • 如果一台主机挂掉,其上所有容器都也都会消失,为确保服务级别的正确性,这个时候Docker会在其他主机上启动新的实例。
  • Docker swarm 遵从 manager-worker architecture ,manager 调度worker上的work。为提供高可靠性,你可以让多个节点都设计为managers节点,但是只有一个阶段处于active状态—the leader。为避免疲惫的选举,一般只部署奇数个主机作managers节点。

Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。
图片.png

例1 Docker Machine and a local VM

说明:本例中,众多docker ps命令都应当更新为最新的docker container ps命令,虽然docker的新版本保留了docker ps命令

1.1 安装Docker-machine

见另外一个文档“七. Docker Machine的安装
”说明

1.2 使用Docker-machine+virtualbox(其上使用Boot2Docker)创建多个local machine(VM)

见另外一个文档“七. Docker Machine的安装
”说明

1.2.1 安装Virtualbox

见另外一个文档“七. Docker Machine的安装
”说明

1.2.2 安装Boot2Docker.iso

见另外一个文档“七. Docker Machine的安装
”说明

1.2.3 建立4个虚机(1个Master+3个Slave)

:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso master
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso slave1
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso slave2
~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso slave3
图片.png

然后查看虚拟机状态:

~$ sudo docker-machine ls
图片.png

1.2.3' 如果已经创建虚拟机

现在只需要重启即可,使用

~$ sudo docker-machine start master
~$ sudo docker-machine start slave1
~$ sudo docker-machine start slave2
~$ sudo docker-machine start slave3
图片.png

再看看虚拟机状态:
图片.png

1.2.3 SSH登陆到虚拟机上

图片.png
1.2.3.1 在master上初始化一个docker swarm集群

在登陆的master虚机里面执行:


图片.png

注意,docker swarm init 命令有个监听ip,这是由于可能有多个地址(host或者vm上)

然后在3个slave虚机上执行:

图片.png

到目前为止,集群已经建立完毕

提示:要退出集群使用下面的命令
docker@slave2:~$ docker swarm leave
docker@master:~$ docker swarm leave --force

1.3 在该docker集群上部署高可用的nginx容器任务


图片.png

然后测试通过两个slave访问niginx(实际上都过这4个虚机的任何一个都是可以的):


图片.png

图片.png

图片.png

登陆到两个slave上查看容器状态:


图片.png

1.4 扩容service中的任务实验

图片.png
登陆到slave上看容器状态(下图docker ps是老的查看docker状态的命令,最新的应当使用docker container ps)
图片.png

查看集群节点
图片.png

1.5 高可用性测试

图片.png

接下来我们把master容器关闭,你会发现过了一会它又起来了(下面的docker ps可以用docker container ps代替,后者是最新的命令):
图片.png

让slave2从集群中消失
图片.png

上图注意:较新的docker中可以用docker container ps查看容器状态

图片.png

你会看到宕机后在slave1上重启了

图片.png

如果我们把slave1-3全部弄宕机:
图片.png

图片.png

较新的docker中可以用docker container ps查看容器状态

遗留两个实验:

  1. 再次启动slave1,会不会容器再次在它环境里面自动启动
  2. master挂掉后是否slave变成master

例2 多个master多个slave的单集群

2.1 创建多个主机实例

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso manager1 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso manager2 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso worker1 
&& sudo docker-machine create --virtualbox-boot2docker-url ~/下载/boot2docker.iso worker2

部分结果展示如下:
图片.png

2.2 查看虚机

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ls
图片.png

2.3 登陆虚机

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
图片.png

2.4 Docker Swarm 配置集群节点

2.4.1 创建第一个管理节点

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.100
图片.png

2.4.2 加入第二个管理节点

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1 "docker swarm join-token manager"
 依据执行结果里面的提示,登陆到manager2节点执行找到的命令,这里是:
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager2 "docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7pp6lsq1rrw72sp6t1ggsj2f-06v7c9nv8pr2fuzgshc9korsa 192.168.99.100:2377"

图片.png

2.4.3 加入工作节点

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh worker1
docker@worker1:~$ docker swarm join --token SWMTKN-1-5l55ipi2uyu141m5qmtlsdxggh7
pp6lsq1rrw72sp6t1ggsj2f-d5dqsszj6micdr8t2de3xpww7 192.168.99.100:2377
图片.png

按照同样的方式把worker2也加进去
图片.png

2.4.4 登陆到manager1查看节点信息

yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ docker node ls
图片.png

2.5 部署集群服务

2.5.1 部署4个容器

docker@manager1:~$ docker service create --replicas 4 -d -p 8080:80 --name nginx nginx:alpine
图片.png

2.5.2 集群服务信息查看

docker@manager1:~$ docker service ls
docker@manager1:~$ docker service ps nginx
图片.png

说明:上图结果是因为我重启了4个虚机
图片.png

例3 使用Docker stack部署多集群

Docker service只能组建单个集群
注意:例2创建的4个虚机我们仍然需要

3.1 创建docker-compose.yml文件并部署

我这里创建的配置文件名为docker-compose-stack.yml文件内容如下(可以使用touch或者vi创建)

version: "3"

services:
  nginx:
    image: 192.168.99.1:5000/nginx:latest
    ports:
      - 8088:80
    deploy:
      mode: replicated
      replicas: 4

  visualizer:
    image: 192.168.99.1:5000/dockersamples/visualizer:latest
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

  portainer:
    image: 192.168.99.1:5000/portainer/portainer:latest
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]

下面命令中-c表示--compose-file, 这里用到的docker-compose-stack.yml必须先copy到manager1主机上,可以用下面的命令:

$ sudo docker-machine scp docker-compose-stack.yml manager1:~
图片.png
yay@10049605-ThinkPad-T470-W10DG:~$ sudo docker-machine ssh manager1
docker@manager1:~$ vi docker-compose.yml
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-demo
图片.png

总结:
创建虚拟主机节点
docker-machine create 虚拟主机名
查看虚拟机节点信息
docker-machine ls
停止虚拟主机节点
docker-machine stop 虚拟主机名
删除虚拟主机节点
docker-machine rm 虚拟主机名
初始化docker swarm集群
docker swarm init --advertise-addr master的IP地址
slave节点加入集群docker swarm join --token [token] [master的IP]:[master的端口]
slave节点主动离开集群
docker swarm leave
在master上获取加入集群的token

docker@master:~$ docker swarm join-token worker
docker@master:~$ docker swarm join-token manager
**master上创建service举例:**

docker service create --replicas 2 -d -p 8080:80 --name 服务名 镜像名
master上查看service信息
docker service ls
docker service ps 你所创建的服务的ID
在master上删除service
docker service rm 服务名
在master上进行服务扩容
docker service scale 你的service name=你要的副本数目
查看swarm 的token
docker@master:~$ docker swarm join-token manager

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容