关于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:2377 To 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 tomcat

ID:		kguawc4b5th4qlwlsv183qtai
Name: tomcat
Service Mode: Replicated
Replicas: 3
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Max failure ratio: 0
ContainerSpec:
Image: tomcat:7.0.96-jdk8-openjdk@sha256:91eadffb59d9a35ada2d39fcd616a749ac580aa5e834499b7128f27be2e46623
Resources:
Networks: tomcat-net
Endpoint Mode: vip
Ports:
PublishedPort 8080
Protocol = tcp
TargetPort = 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 demo 6imq8da3vcwvj2n499k ...

  2. 在Docker Swarm上部署Apache Storm:第2部分

    [编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...

  3. 在Docker Swarm上部署Apache Storm:第1部分

    [编者按]本文来自 Baqend Tech Blog,描述了如何在 Docker Swarm,而不是在虚拟机上部署和调配Apache Storm集群.文章系国内 ITOM 管理平台 OneAPM 编译 ...

  4. 用Docker swarm快速部署Nebula Graph集群

    用Docker swarm快速部署Nebula Graph集群 一.前言 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群. 二.nebula集群搭建 2.1 环境准 ...

  5. 本文介绍如何使用 Docker Swarm 来部署 Nebula Graph 集群,并部署客户端负载均衡和高可用

    本文作者系:视野金服工程师 | 吴海胜 首发于 Nebula Graph 论坛:https://discuss.nebula-graph.com.cn/t/topic/1388 一.前言 本文介绍如何 ...

  6. docker swarm快速部署redis分布式集群

    环境准备 四台虚拟机 192.168.2.38(管理节点) 192.168.2.81(工作节点) 192.168.2.100(工作节点) 192.168.2.102(工作节点) 时间同步 每台机器都执 ...

  7. 35. docker swarm dockerStack 部署 投票应用

    1. 编写 docker-compose.yml # docker-compose.yml version: "3" services: redis: image: redis:a ...

  8. 34. docker swarm Dockerstack 部署 wordpress

    1. 查看 docker compose    depoly 语法 官网地址 : https://docs.docker.com/compose/compose-file/#deploy ENDPOI ...

  9. centos7 部署 docker swarm

    =============================================== 2019/4/9_第3次修改                       ccb_warlock 更新说 ...

随机推荐

  1. android——SQLite数据库存储(操作)

    public class MyDatabaseHelper extends SQLiteOpenHelper { //把定义SQL建表语句成字符串常量 //图书的详细信息 //ID.作者.价格.页数. ...

  2. ubuntu下部署mongodb以及设置允许远程连接

    最近因为项目原因需要在阿里云服务器上部署mongodb,网上查阅了一些资料,特此记录一下步骤 1.运行apt-get install mongodb命令安装mongodb服务(如果提示找不到该pack ...

  3. java算法(4)---静态内部类实现雪花算法

    静态内部类单例模式实现雪花算法 在生成表主键ID时,我们可以考虑主键自增 或者 UUID,但它们都有很明显的缺点 主键自增:1.自增ID容易被爬虫遍历数据.2.分表分库会有ID冲突. UUID: 1. ...

  4. 最大层内元素和----leetcode周赛150_1002

    题目描述: 给你一个二叉树的根节点 root.设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推. 请你找出层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 ...

  5. 【资源共享】eBook分享大集合

    传送门:[GitHub] 欢迎各位指点,要是能补充更是感激不尽. 主要以IT领域经典书籍收藏,以备不时之需,不一定都能看完,权且当做收藏好玩. [x] 表示文件大小超过100M(LFS). 服务器系统 ...

  6. win10下vc++6.0的安装问题

    由于最近需要在win10系统下用到vc++来编程(其实刚开始我是拒绝的,因为vc++各种坑),下面我就把安装vc++时遇到的问题记录下来,方便以后同样遇到这些问题的同学. 安装vc++6.0所需要东西 ...

  7. Appium+Python+Genymotion ------环境配置

    前言 之前总是在找方向,也研究了很多的工具,终于找到了适合自己的一套,打算把学习的过程做一个记录,给自己加深印象,也希望能给其他人一些帮助. 一.工具准备 1.Appium  //  http://a ...

  8. 危险的Hystrix线程池

    本文介绍Hystrix线程池的工作原理和参数配置,指出存在的问题并提供规避方案,阅读本文需要对Hystrix有一定的了解. 文本讨论的内容,基于hystrix 1.5.18: <dependen ...

  9. linux系统破解密码。

    Linux系统Centos7及RedHat7破解密码 步骤如下: 1.开机之后按"e"键 2.找到以linux16的开头的行在行尾添加 rd.break console=tty0 ...

  10. MUI-页面传参数

    点击第一个页面的标签,跳转到第二个页面,把第一个页面的值也传往目标页面 现在提供两种实现方式 注意:需要在手机运行才可以,用电脑浏览器可能不支持. 第一种方式  页面已创建,通过自定义事件传值 fir ...