关于Docker Swarm

Docker Swarm由两部分组成:

  1. Docker集群:将一个或多个Docker节点组织起来,用户就能以集群的方式进行管理;
  2. 应用编排:有一套API用来部署和管理容器;

官方资料:https://docs.docker.com/swarm/

网络图

下图是个典型的Docker Swarm集群部署图,来自Docker官网:

接下来照着上图来搭建一个Docker Swarm集群。

准备工作

本次实战一共用到了5台机器,配置信息全部相同,如下:

  1. 操作系统:CentOS Linux release 7.6.1810
  2. Docker服务版本:1.13.1
  3. 防火墙都已经关闭;

机器的信息如下表所示:

IP地址 主机名 身份
192.168.121.142 m0 管理节点
192.168.121.139 m1 管理节点
192.168.121.140 m2 管理节点
192.168.121.141 w0 工作节点
192.168.121.138 w1 工作节点

为什么要三个管理节点?

从官方图可见,管理节点集群之间的内部管理协调使用了Raft共识算法,这样就保证了管理节点高可用(HA),一般情况下会参考以下两个原则:

  1. 部署奇数个管理节点,这样有利于减少脑裂;
  2. 不要部署太多管理节点,因为越多管理节点意味着需要花费跟多时间来达成共识;

部署集群步骤简介

接下来的整个部署过程分为以下几步:

  1. 初始化第一个管理节点(m0);
  2. 加入新的管理节点(m1、m2);
  3. 加入工作节点(w0、w1);

接下来正式开始吧;

初始化第一个管理节点(m0)

  1. m0节点的IP地址是192.168.121.142,因此在m0节点执行以下命令:
docker swarm init \
--advertise-addr 192.168.121.142:2377
--listen-addr 192.168.121.142:2377

关于advertise-addr和listen-addr这两个参数,前者用来指定其他节点连接m0时的地址,后者指定承载swarm流量的IP和端口,它们更详细和深入的区别可以参考文章:https://boxboat.com/2016/08/17/whats-docker-swarm-advertise-addr/
2. 控制台返回信息如下,表明Swarm集群初始化成功:

Swarm initialized: current node (7585zt09o2sat82maef0ocf42) is now a manager.To add a worker to this swarm, run the following command:docker swarm join \--token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \192.168.121.142:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  1. 列出当前Swarm集群的所有节点,可以看到唯一的节点m0的状态和身份:
[root@m0 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
7585zt09o2sat82maef0ocf42 *  m0        Ready   Active        Leader

现在集群已经建立起来了,接下来我们需要加入更多的管理节点和工作节点;

如何加入新的节点?

  1. Docker Swarm的新节点加入策略是从管理节点获取一长串命令,被称为join token,任何想加入集群的机器只要自己执行这个join token即可加入Swarm集群;
  2. 如果有新的管理节点需要加入,在m0执行命令docker swarm join-token manager即可得到管理节点的join token,如下所示:
[root@m0 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:docker swarm join \--token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-5tz9d4w7nwzu8r4ozd0ff2aiu \192.168.121.142:2377
  1. 如果有新的工作节点需要加入,在m0执行命令docker swarm join-token worker即可得到工作节点的join token,如下所示:
[root@m0 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:docker swarm join \--token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \192.168.121.142:2377

两种join token都准备好了,接下来开始加入新节点。

加入管理节点m1、m2

  1. 在m1上执行前面取得的管理节点join token:
[root@m1 ~]# docker swarm join \
>     --token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-5tz9d4w7nwzu8r4ozd0ff2aiu \
>     192.168.121.142:2377
This node joined a swarm as a manager.
  1. 在m2上做同样的操作;
  2. 在m0、m1、m2其中的任意一台上执行命令docker node ls查看Swarm集群的现状,如下图,可见三个管理节点都是正常状态,ID字段带有星号后缀表示当前执行命令的机器是m1:
[root@m1 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
0isfyre69mdu1hm11esf1q3dk    m2        Ready   Active        Reachable
7585zt09o2sat82maef0ocf42    m0        Ready   Active        Leader
slc0hjbs7jh2hdi8ai3wohy23 *  m1        Ready   Active        Reachable

加入工作节点w0、w1

  1. 在w0上执行前面取得的工作节点的join token:
[root@w0 ~]# docker swarm join \
>     --token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \
>     192.168.121.142:2377
This node joined a swarm as a worker.
  1. 在w1上做同样的操作;
  2. 在m0、m1、m2其中的任意一台上执行命令docker node ls查看Swarm集群的现状,可见工作节点已经全部就绪:
[root@m0 ~]# docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
0isfyre69mdu1hm11esf1q3dk    m2        Ready   Active        Reachable
7585zt09o2sat82maef0ocf42 *  m0        Ready   Active        Leader
i71bcxt1auc804syybroajtan    w1        Ready   Active
slc0hjbs7jh2hdi8ai3wohy23    m1        Ready   Active        Reachable
wqcwcccva3d3mxgi5p423d4fv    w0        Ready   Active

至此,Swarm集群环境搭建完毕,接下来可以验证了。

验证Swarm集群环境

  1. 创建名为tomcat-net的覆盖网络(Overlay Netowork),这是个二层网络,处于该网络下的docker容器,即使宿主机不一样,也能相互访问:
docker network create -d overlay tomcat-net
  1. 创建名为tomcat的服务,使用了刚才创建的覆盖网络:
docker service create --name tomcat \
--network tomcat-net \
-p 8080:8080 \
--replicas 3 \
tomcat:7.0.96-jdk8-openjdk
  1. 执行命令docker service ls查看当前所有服务:
[root@m0 ~]# docker service ls
ID            NAME    MODE        REPLICAS  IMAGE
kguawc4b5th4  tomcat  replicated  3/3       tomcat:7.0.96-jdk8-openjdk
  1. 执行命令docker service ps tomcat查看名为tomcat的服务,可见三个容器分别部署在m0、m2、w1机器上:
[root@m0 ~]# docker service ps tomcat
ID            NAME      IMAGE                       NODE  DESIRED STATE  CURRENT STATE           ERROR  PORTS
n1gs9f1plce2  tomcat.1  tomcat:7.0.96-jdk8-openjdk  w1    Running        Running 19 minutes ago
q8jyg088ci21  tomcat.2  tomcat:7.0.96-jdk8-openjdk  m2    Running        Running 19 minutes ago
h9ww33dpw56m  tomcat.3  tomcat:7.0.96-jdk8-openjdk  m0    Running        Running 19 minutes ago
  1. 执行命令docker service inspect --pretty tomcat查看名为tomcat的服务的详细信息(去掉–pretty可以看到更完整的):
[root@m0 ~]# docker service inspect --pretty tomcatID:      kguawc4b5th4qlwlsv183qtai
Name:       tomcat
Service Mode:   ReplicatedReplicas: 3
Placement:
UpdateConfig:Parallelism:   1On failure:    pauseMax failure ratio: 0
ContainerSpec:Image:        tomcat:7.0.96-jdk8-openjdk@sha256:91eadffb59d9a35ada2d39fcd616a749ac580aa5e834499b7128f27be2e46623
Resources:
Networks: tomcat-net
Endpoint Mode:  vip
Ports:PublishedPort 8080Protocol = tcpTargetPort = 8080
  1. 打开浏览器,尝试访问m0、m1、m2、w0、w1这个五个机器的8080端口,都可以成功访问tomcat首页:

服务模式

  1. 服务模式一共有两种:Ingress和Host,如果不指定,则默认的是Ingress;
  2. Ingress模式下,到达Swarm任何节点的8080端口的流量,都会映射到任何服务副本的内部80端口,就算该节点上没有tomcat服务副本也会映射;
  3. Host模式下,仅在运行有容器副本的机器上开放端口,使用Host模式的命令如下:
docker service create --name tomcat \
--network tomcat-net \
--publish published=8080,target=8080,mode=host \
--replicas 3 \
tomcat:7.0.96-jdk8-openjdk

服务扩缩容

  1. 执行命令docker service scale tomcat=5将副本数从3调整为5:
[root@m0 ~]# docker service scale tomcat=5
tomcat scaled to 5
  1. 执行命令docker service ps tomcat查看名为tomcat的服务,可见每台机器上都分布了一个容器:
[root@m0 ~]# docker service ps tomcat
ID            NAME      IMAGE                       NODE  DESIRED STATE  CURRENT STATE               ERROR  PORTS
w32tjahze2fk  tomcat.1  tomcat:7.0.96-jdk8-openjdk  m2    Running        Running 42 minutes ago
yj5czwwhrrsh  tomcat.2  tomcat:7.0.96-jdk8-openjdk  m0    Running        Running 42 minutes ago
pq40995nbd0k  tomcat.3  tomcat:7.0.96-jdk8-openjdk  w1    Running        Running 42 minutes ago
y1y6z1jczel1  tomcat.4  tomcat:7.0.96-jdk8-openjdk  m1    Running        Running about a minute ago
w0dcii8f79os  tomcat.5  tomcat:7.0.96-jdk8-openjdk  w0    Running        Running about a minute ago

滚动升级

  1. 当前tomcat服务中,tomcat镜像的tag是7.0.96-jdk8-openjdk,我们来尝试升级到9.0.24-jdk11-openjdk,执行以下命令:
docker service update \
--image tomcat:9.0.24-jdk11-openjdk \
--update-parallelism 1 \
--update-delay 10s tomcat

上述命令有几处需要注意:
a. update-parallelism:每次更新的容器数量,这里设置为1,表示每一个容器升级成功后才去升级下一个;
b. update-delay:每一批升级成功后,升级下一批之前的等待时间,这里表示升级一个容器后等10秒再升级下一个;
2. 在升级过程中执行命令docker service ps tomcat查看服务,可以看到新版本容器逐个启动的过程:

[root@m0 ~]# docker service ps tomcat
ID            NAME          IMAGE                        NODE  DESIRED STATE  CURRENT STATE                ERROR  PORTS
w32tjahze2fk  tomcat.1      tomcat:7.0.96-jdk8-openjdk   m2    Running        Running 56 minutes ago
yj5czwwhrrsh  tomcat.2      tomcat:7.0.96-jdk8-openjdk   m0    Running        Running 56 minutes ago
semuna9awsn7  tomcat.3      tomcat:9.0.24-jdk11-openjdk  w1    Running        Running 15 seconds ago
pq40995nbd0k   \_ tomcat.3  tomcat:7.0.96-jdk8-openjdk   w1    Shutdown       Shutdown about a minute ago
y1y6z1jczel1  tomcat.4      tomcat:7.0.96-jdk8-openjdk   m1    Running        Running 15 minutes ago
oot3yex74v4t  tomcat.5      tomcat:9.0.24-jdk11-openjdk  w0    Running        Preparing 5 seconds ago
w0dcii8f79os   \_ tomcat.5  tomcat:7.0.96-jdk8-openjdk   w0    Shutdown       Shutdown 3 seconds ago
  1. 升级完成后,用浏览器访问服务,可见tomcat版本已经升级:

删除服务

执行命令docker service rm tomcat即可删除服务:

[root@m0 ~]# docker service rm tomcat
tomcat
[root@m0 ~]# docker service ls
ID  NAME  MODE  REPLICAS  IMAGE

至此,Docker Swarm从部署到基本操都已经体验过一次了,希望您在搭建环境的时候,本文能给您一些参考。

欢迎关注我的公众号:程序员欣宸

Docker Swarm从部署到基本操作相关推荐

  1. Docker swarm 实战-部署wordpress

    Docker swarm 实战-部署wordpress 创建一个overlay的网络 docker network create -d overlay demo6imq8da3vcwvj2n499k4 ...

  2. 聊聊 Docker Swarm 部署 gRPC 服务的坑

    gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计,也是目前流行的微服务架构中比较突出的跨语言 RPC 框架. 一直以来,我们的微服务都是基于 gRPC 来开发,使用的 ...

  3. 如何使用Docker Swarm管理更多容器

    by nolan grace 通过诺兰·格雷斯 如何使用Docker Swarm管理更多容器 (How to manage more containers with Docker Swarm) Sca ...

  4. 使用Docker Swarm来运行服务

    本文讲的是使用Docker Swarm来运行服务[编者的话]本文介绍了Docker 1.12中的Docker Swarm Mode,包括如何安装Docker Engine.如何建立Swarm集群.如何 ...

  5. docker swarm节点创建

    1.docker swarm 节点部署 设备准备:(机器环境Centos:7) IP:10.0.0.5 主机名:manager_master 角色:swarm manager IP:10.0.0.3 ...

  6. Spring Cloud【使用jenkins持续部署】Gogs+jenkins+Docker Swarm+Protainer

    导读: 很久没有更新文章了 最近公司在使用Spring Cloud构建的项目中经常会持续发布变更频繁,一天中会出现发布多次的情况 在这种情况下对测试环境做了改造 使得开发人员可以不再过多关注发布与更新 ...

  7. 正式环境docker部署hyperf_应用部署 - Docker Swarm 集群搭建 - 《Hyperf v1.1.1 开发文档》 - 书栈网 · BookStack...

    Docker Swarm 集群搭建 现阶段,Docker容器技术已经相当成熟,就算是中小型公司也可以基于 Gitlab.Aliyun镜像服务.Docker Swarm 轻松搭建自己的 Docker集群 ...

  8. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

  9. 使用Docker Swarm部署MinIO ​​​​​​​

    使用Docker Swarm部署MinIO Docker Engine在Swarm模式下提供集群管理和编排功能. MinIO服务器可以在Swarm的分布式模式下轻松部署,创建一个多租户,高可用性和可扩 ...

最新文章

  1. 安卓import android.support.v7.app.AppCompatActivity报错
  2. 基于快速原型模型建立商业呼叫中心SPOMP的应用研究
  3. Java 中关于 null 对象的容错处理
  4. 一个C语言小程序,有10几个命令和MSDOS一样哦:)
  5. 【翻译】WF从入门到精通(一)
  6. SeekBar的用法和自定义滑块的样式
  7. 对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解
  8. 提问的智慧 - How To Ask Questions The Smart Way
  9. 统计通话次数和时间的软件_通话时间统计app下载-通话时间统计下载 2.2.2 安卓版 - 河东软件园...
  10. 基于bp神经网络的房价预测,房价预测 神经网络
  11. 基于C/C++的PCM编码与解码简单实现
  12. vmware 虚拟机安装系统成功,没有虚拟网卡的完美解决方法
  13. html导航栏可以展开的下拉菜单,html导航栏下拉菜单如何制作
  14. DEV 报表设计分组
  15. 打开PowerPoint提示:PowerPoint上次起送时失败。以安全模式启动PowperPoint将帮助您纠正或发现启动中的问题
  16. 调研主板,树莓派 VS RK3288板子,还是 RK的主板香,但是只支持 anrdoid 7系统,估计也有刷机成 armbian或者
  17. windows10删除多余顽固输入法
  18. LR1110接入腾讯云
  19. PostgreSQL 儒略历学习资料
  20. linux拷贝优先级,Linux快速入门之命令

热门文章

  1. PADS Logic中单个器件的PCB封装应该怎么处理呢?
  2. MFC基于单文档实现绘图功能(线段,矩形,椭圆,圆,铅笔,橡皮),保姆式教程
  3. RLC串并联谐振回路特性、如何判断容性感性
  4. catia相合约束怎么反向_朝花夕拾—CATIA联盟一周技术聊天回顾
  5. iOS开发中,如何防止Crash(闪退,崩溃)?
  6. 心理测评系统选购指南
  7. 一起来用 Python 做个是男人就坚持100秒游戏
  8. 第7章-JavaScript基础
  9. 【keep-alive原理】
  10. O(nlogn)级排序之希尔排序