Docker swarm

docker swarm集群:三剑客之一

一. Docker Swarm 的基本概念和原理

Docker Swarm 简介

Swarm是Docker公司推出的用来管理docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用go语言来完成开发,Swarm0.2发布,相比0.1版本,0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息.

Docker Swarm 工作原理

Docker 客户端通过 Docker API 向 Swarm 管理端发送请求,Swarm Manager 通过守护进程调用集群中的某个节点来执行任务。因为容器都是运行在节点上,Swarm 作为一个独立的集群管理工具,故并不会因某些原因导致不能正常工作而影响集群内所有节点的正常运行。当服务恢复正常后,Swarm 会读取日志来执行集群的恢复动作。架构图如图 1:

图 1.Docker Swarm 架构图

二. Docker Swarm要点

**Swarm的负载非常低。**据我观察,Swarm进行调度和通信的CPU负载非常低。因此,Swarm的管理节点(Manager)可以同时作为工作节点(Worker)。如果你需要搭建一个非常大的集群(1000+ 节点),管理节点需要更多资源,但是对于中小型集群来说,管理节点需要的资源可以忽略不计。

**Swarm集群的网络通信(服务发现,负载均衡以及容器间通信)非常可靠。**当你开启一个服务的端口之后,在Swarm集群中的任何一个节点都可以访问它。负载均衡也是由Swarm提供的。后文会提到一些之前遇到的问题,但是Docker 1.13之后,这些问题都解决了。

三. 实验环境

主机 IP地址 服务
docker01 192.168.1.11 swarm+service+webUI+registry
docker02 192.168.1.13 docker
docker03 192.168.1.20 docker

三台主机都关闭防火墙,禁用selinux,修改主机名,时间同步,并添加域名解析。

docker版本必须是:v1.12版本开始(可使用docker version查看版本)

1.关闭防火墙,禁用selinux

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# hostnamectl set-hostname docker03
[root@localhost ~]# su -

2.时间同步

mv /etc/localtime /etc/localtime.bk
cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime

3.修改主机名(三台都要)

[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -

4.添加域名解析

[root@docker01 ~]# echo 192.168.1.11 docker01 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.13 docker02 >> /etc/hosts
[root@docker01 ~]# echo 192.168.1.20 docker03 >> /etc/hosts

四. swarm原理

**swarm:**作用运行docker engin的多个主机组成的集群

**node:**每一个docker engin都是一个node(节点),分为manager和worker。

**manager node:**负责执行容器的编排和集群的管理工作,保持并维护swarm处于期望的状态。swarm可以有多个manager node,他们会自动协调并选举一个leader执行编排任务。但相反,不能没有manager node。

**worker node:**接受并执行由manager node派发的任务,并且默认manager node也是一个worker node,不过可以将它设置为manager-only node,让他只负责编排和管理工作。

**service:**用来定义worker上执行的命令。

基本命令操作

**docker swarm leave:**申请离开一个集群,之后查看节点状态会变成down,然后可通过manager node 将其删除
**docker node rm xxx:**删除某个节点

docker swarm join-token [manager|worker]:生成令牌,可以是manager或worker身份。

docker node demote(降级):将swarm节点的为manager降级为worker

docker node promote(升级):将swarm节点的work升级为manager

**docker node ls:**查看群集的信息(只可以在manager角色的主机上查看)

docker service scale web05=6:容器的动态扩容及缩容

docker service ps web01: 查看创建的容器运行在哪些节点

docker service ls: 查看创建的服务

docker swarm leave: 脱离这个群集

docker node rm docker03: 在manager角色的服务器上移除docker03

docker node update --availability drain docker01: 设置主机docker01以后不运行容器,但已经运行的容器并不会停止

docker node update --label-add mem=max docker03: 更改docker03主机的标签为mem=max

docker service update --replicas 8 --image 192.168.20.6:5000/lvjianzhao:v2.0 --container-label-add ‘node.labels.mem==max’ lvjianzhao05: 将服务升级为8个容器,并且指定在mem=max标签的主机上运行

五. docker01 初始化集群

[root@docker01 ~]# docker swarm init --advertise-addr 192.168.1.11

**–advertise-addr:**指定与其它docker通信的地址。

上边返回的结果告诉我们:初始化成功,并且,如果想要添加work节点运行下面的命令:

注意:token令牌只有24小时的有效期

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

如果想要添加manager节点:运行下面命令

六.swarm集群的简单操作

1、docker02和docker03以worker加入集群

[root@docker03 ~]# docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-1e60wt0yr5583e4mzwbxnn3a8 192.168.1.11:2377

docker01查看集群

[root@docker01 ~]# docker node ls

注意:这里的”*****“代表的是当前所属的节点

2.删除集群中节点

docker02和docker03申请离开一个集群
[root@docker02 ~]# docker swarm leave
docker删除docker02和docker03节点
[root@docker01 ~]# docker node rm docker02
[root@docker01 ~]# docker node rm docker03
docker01查看集群
[root@docker01 ~]# docker node ls

3.docker02和docker03以manager加入集群

docker01生成manager令牌

[root@docker01 ~]# docker swarm join-token manager

docker02和docker03加入集群

docker swarm join --token SWMTKN-1-5kxn9wloh7npnytklwbfciesr9di7uvu521gwnqm9h1n0pbokj-cz6hbyv9r5htyqwj5tfol65aa 192.168.1.11:2377

docker01查看集群

[root@docker01 ~]# docker node ls

4.docker02和docker03降级

docker01(manager)把docker02和docker03降级成worker

[root@docker01 ~]# docker node  demote docker02
[root@docker01 ~]# docker node  demote docker03

查看集群

[root@docker01 ~]# docker node ls

五.设置manager node(docker01)不参加工作

[root@docker01 ~]# docker node update docker01 --availability drain

设置主机docker01以后不运行容器,但已经运行的容器并不会停止
“–availability”选项后面共有三个选项可配置,如下:
“active”:工作;“pause”:暂时不工作;“drain”:永久性的不工作

[root@docker01 ~]# docker node ls

八. docker01部署一个图形化webUI界面

1.docker01 导入镜像

[root@docker01~]# docker pull dockersamples/visualizer

2.基于镜像启动一台容器

[root@docker01 ~]# docker run -d -p 8080:8080 -e HOST=192.168.1.100 -e PORT=8080 -v /var/run/docker.sock:/var/run/docker.sock --name visualiaer  dockersamples/visualizer

3.通过浏览器访问验证http://192.168.1.11:8080/

如果访问不到网页,需开启路由转发

[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p

一. Docker01部署一个私有仓库

Docker01部署

72 docker pull registry
//下载registry镜像73 docker run -itd --name registry -p 5000:5000 --restart=always registry:latest
//基于registry镜像,启动一台容器78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker76 docker tag busybox:latest 192.168.1.11:5000/busybox:v1
//把容器重命名一个标签77 docker ps

78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker100 docker push 192.168.1.11:5000/busybox:v1
//上传容器到私有仓库

Docker02和docker03加入私有仓库

78 vim /usr/lib/systemd/system/docker.service #13行修改
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000  80 systemctl daemon-reload
81 systemctl restart docker.service
//重启docker99 docker pull 192.168.1.11/busybox:v1
//测试下载

2. 自定义镜像

要求:基于httpd镜像,更改访问界面内容。镜像tag版本为v1,v2,v3,对应主机面内容为v1,xgp666、v2,xgp666、v2,xgp666

[root@docker01 ~]# docker pull httpd
//下载httpd镜像

创建三个测试目录

[root@docker01 ~]# mkdir {v1,v2,v3}
//创建测试目录

docker01,v1目录操作

[root@docker01 ~]# cd v1
[root@docker01 v1]# echo v1,xgp666 > index.html
//创建测试网页[root@docker01 v1]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /c[root@docker01 v1]# docker build -t 192.168.1.11:5000/httpd:v1 .
//基于dockerfile创建镜像[root@docker01 v1]# docker push  192.168.1.11:5000/httpd:v1
//上传刚刚创建镜像到私有仓库

docker01,v2目录操作

[root@docker01 v1]# cd ../v2
[root@docker01 v2]# echo v2,xgp666 > index.html[root@docker01 v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v2 .
//基于dockerfile创建镜像[root@docker01 v2]# docker push  192.168.1.11:5000/httpd:v2
//上传刚刚创建镜像到私有仓库

docker01,v3目录操作

[root@docker01 v1]# cd ../v3
[root@docker01 v2]# echo v3,xgp666 > index.html[root@docker01 v2]# vim Dockerfile
//编写Dockerfile
FROM httpd
ADD index.html /usr/local/apache2/htdocs/index.html[root@docker01 v2]# docker build -t 192.168.1.11:5000/httpd:v3 .
//基于dockerfile创建镜像[root@docker01 v2]# docker push  192.168.1.11:5000/httpd:v3
//上传刚刚创建镜像到私有仓库

3. 发布一个服务,基于上述镜像

要求:副本数量为3个。服务的名称为: bdqn

[root@docker01 v3]# docker service create --replicas 3 --name bdqn  -p 80:80 192.168.1.11:5000/httpd:v1

查看一下网络

[root@docker03 ~]# docker network ls

默认的Ingress网络,包括创建的自定义overlay网络, 为后端真正为用户提供服务的container,提供了一个统一的入口。

查看一下创建的副本

[root@docker01 v3]# docker service ps bdqn

浏览器测试访问http://192.168.1.11:80,http://192.168.1.13:80,http://192.168.1.20:80

修改docker02和docker03测试网页内容

docker02

[root@docker02 ~]# docker exec -it 388f3bd9dd33 /bin/bash
root@388f3bd9dd33:/usr/local/apache2# cd htdocs/
root@388f3bd9dd33:/usr/local/apache2/htdocs# echo 123 > index.html

docker03

[root@docker03 ~]# docker exec -it 281454867fac /bin/bash
root@281454867fac:/usr/local/apache2# echo 321 > htdocs/index.html

测试访问(每一台都会显示,会负载均衡)

要求:副本数量为3个。服务的名称为:test

[root@docker01 v3]# docker service create --replicas 3 --name test  -p 80  192.168.1.11:5000/httpd:v1

查看创建的服务映射端口

[root@docker01 v3]# docker service ls

默认映射端口30000-32767

4. 服务的扩容与缩容

扩容

[root@docker01 v3]# docker service scale bdqn=6

缩容

[root@docker01 v3]# docker service scale bdqn=4

扩容与缩容直接直接通过scale进行设置副本数量。

5.服务的升级与回滚

(1)升级

[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v2 bdqn
//把bdqn服务升级成v2的版本

测试访问一下

(2)平滑的更新

[root@docker01 ~]# docker service update --image 192.168.1.11:5000/httpd:v3  --update-parallelism 2 --update-delay 1m bdqn
//两个服务一起更新,然后,隔一分钟,继续更新

默认情况下, swarm-次只更新-个副本,并且两个副本之间没有等待时间,我们可以通过
–update-parallelism;设置并行更新的副本数量。
–update-delay:指定滚动更新的时间间隔。

测试访问一下

(3) 回滚操作

[root@docker01 ~]# docker service  rollback bdqn

注意,docker swarm的回滚操作,默认只能回滚到上一-次操作的状态,并不能连续回滚到指定操作。

测试访问一下

docker swarm版本回滚相关推荐

  1. git---远程仓库版本回滚

    开发中,发现有错误版本提交带远程分支master,怎么处理? 1 简介 最近在使用git时遇到了远程分支需要版本回滚的情况,于是做了一下研究,写下这篇博客. 2 问题 如果提交了一个错误的版本,怎么回 ...

  2. 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )

    文章目录 一.查看提交记录 git log 1.查看详细提交记录 2.查看简略提交记录 二.版本回滚 git reset 1.Git 中的版本表示 HEAD~1 2.版本库代码回滚 三.撤销回滚 1. ...

  3. git 代码回滚_git代码版本管理(1)——git版本回滚

    git代码版本管理(1)--git版本回滚 1.问题背景 在利用github.gitlab.Gitee等代码管理器中对代码的管理,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提 ...

  4. Git使用学习(七、版本回滚)

    git版本回滚的原理 git中有一个全局变量叫HEAD,HEAD这个指针指向的版本就是当前版本. 如果我们需要调出某个版本的记录,需要让HEAD指针指向这个版本,然后再从本地仓库拉取到工作区间就可以了 ...

  5. git:历史版本回滚、重新回到最新版本及取消修改内容

    重新检出历史版本 场景:需要回到之前的版本,修改参数执行一下代码 查看历史版本号 git log -10 #查看最近10次commit的记录 检出历史版本 git checkout <版本号&g ...

  6. Linux svn 版本回滚的方法

    svn log -v 显示所有日志 并带修改的文件名svn log -r ver1:ver2 显示2个版本之间的改动 svn diff -r ver1:ver2版本回滚 综上,最必要的就是3个步骤: ...

  7. GIt版本回滚的两种方法reset、revert

    在学习关于git版本回滚操作之前我们应该需熟练使用git log查看Git提交日志,同时也应学会使用git reflog查看Git提交日志. 可参考博客:git log的使用_WEB前端李志杰的博客- ...

  8. k8s、控制器模式解析、定义多少个副本、卷挂载、滚动更新、版本回滚

    文章目录 控制器模式解析 项目:Nginx使用卷挂载 滚动更新 第一种方法: 第二种方法 版本回滚 第一种方法版本升级 第二种方法 第三种方法 控制器模式解析 创建一个pod,有俩个副本,最简单的 例 ...

  9. 支付宝小程序灰度测试、版本回滚能力新上线

    小程序又有一新能力上线啦~ 为了让开发者们灵活管理小程序版本,减少小程序新版本发布时出现缺陷对线上用户体验造成影响,开发者在发布新版时,可先进行灰度测试. 同时可逐步扩大灰度范围,当灰度测试用户无明显 ...

最新文章

  1. mysql中explain的用法
  2. ios绘图基本图形之线条
  3. python爬虫插件_Python使用Chrome插件实现爬虫过程图解
  4. 十天学会ASP.Net——(8)
  5. DataForm 中通过外面的按钮进行提交时,出错
  6. 浏览器专属 CSS Hack:区分 Firefox / Opera / Safari / Internet Explorer
  7. 疫情加速中国服务器采购 数字化转型成为增长“新引擎”
  8. Vue3初始化需要安装的插件
  9. 常用 MQTT 客户端库简介
  10. mysql内连接去重复_MYSQL 内连接查询重复
  11. 网站备案后服务器更换到家里,域名备案后能更换服务器吗
  12. 完全但不完美信息博弈
  13. android 4.4刷机,刷机大师V3.4.4更新:支持Android 4.4
  14. 告别“霍金音”:华裔科学家设计脑机新设备,人类首次直接用脑波“说话”...
  15. vscode源代码管理文件挂起
  16. 2021年中国体育彩票行业市场现状分析,体彩销售额同比增长21.9%「图」
  17. 织梦dedecms模板文件在哪
  18. 12306登录python_Python模拟登录12306
  19. Discuz 论坛设置发帖最大字数
  20. 你想拥有开挂的人生吗?

热门文章

  1. 爱了爱了!kafka视频百度云
  2. 2018年四川理工学院软件工程考试大纲(软件工程概述)
  3. glibc-2.29 large bin attack 原理
  4. 论计算机辅助英语教学视频教程,论大学英语教学中的多媒体计算机辅助语言教学.pdf...
  5. c语言输出手机号是负的是怎么回事,找出正确手机号码
  6. 使用python开发性格分析工具
  7. 记忆中的电影《无敌鸳鸯腿》
  8. 全球著名IT公司名字的由来
  9. 软件咨询——并不像看上去那样简单
  10. 微信小程序 -- (1)文档说明、配置项