GVKun编程网logo

Docker Swarm 集群部署(docker swarm集群搭建)

13

如果您想了解DockerSwarm集群部署的相关知识,那么本文是一篇不可错过的文章,我们将对dockerswarm集群搭建进行全面详尽的解释,并且为您提供关于29.dockerswarm创建三个节点s

如果您想了解Docker Swarm 集群部署的相关知识,那么本文是一篇不可错过的文章,我们将对docker swarm集群搭建进行全面详尽的解释,并且为您提供关于29. docker swarm 创建 三个节点 swarm 的集群、35. docker swarm dockerStack 部署 投票应用、ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练、Docker (二十一)-Docker Swarm 集群部署的有价值的信息。

本文目录一览:

Docker Swarm 集群部署(docker swarm集群搭建)

Docker Swarm 集群部署(docker swarm集群搭建)

介绍

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具。Docker 1.12 内嵌了 swarm mode 集群管理模式。

Swarm 关键概念

1)Swarm

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

2)Node

一个节点 (node) 是已加入到 swarm 的 Docker 引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着 Manager

管理节点调度任务到 worker 节点,manager 节点还执行维护集群的状态的编排和群集管理功能,worker 节点接收并执行来自

manager 节点的任务。通常,manager 节点也可以是 worker 节点,worker 节点会报告当前状态给 manager 节点

3)服务(Service)

服务是要在 worker 节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像

4)任务(Task)

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

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 查看帮助)

node 是加入到 swarm 集群中的一个 docker 引擎实体,可以在一台物理机上运行多个 node,node 分为:manager nodes 管理节点,worker nodes 工作节点。

 一、系统环境

  1)服务器环境

节点名称 IP 操作系统 内核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

  2)前提条件

  • Docker 版本 1.12+
  • 集群节点之间保证 TCP 2377、TCP/UDP 7946 和 UDP 4789 端口通信   

    TCP 端口 2377 集群管理端口

    TCP 与 UDP 端口 7946 节点之间通讯端口

    TCP 与 UDP 端口 4789 overlay 网络通讯端口

二、集群部署

  1)master 创建 Swarm(要保存初始化后 token,因为在节点加入时要使用 token 作为通讯的密钥)  

1
2
3
4
5
6
7
8
[root@master ~] # docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6)  is  now a manager.
 
To add a worker to this swarm, run the following command:
 
     docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377
 
To add a manager to this swarm, run  ''docker swarm join-token manager''  and  follow the instructions. 

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

  使用 docker info 或者 docker node ls 查看集群中的相关信息 

1
2
3
4
5
6
7
8
9
10
11
12
13
docker info
 
.......
Swarm: active
  NodeID: kfi2r4dw6895z5yvhlbyzfck6
  Is Manager: true
  ClusterID: y2zgs373cg0y6559t675yexcj
  Managers:  1
  Nodes:  1
  Orchestration:
   Task History Retention Limit:  5
 
.......

  

  2)添加节点到 swarm 集群中

  所有节点执行 

1
docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377

  在 master 上查看集群节点的状态

  

   到此 Swarm 集群就创建好了

  3)docker  node 命令 

复制代码
[root@master ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:


Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


# demote
   将管理节点降级为普通节点
# inspect
    查看节点的详细信息
# ls
   列出节点
# promote
   将普通节点升级为管理节点
# ps
   查看运行的任务
# rm
   从swarm集群中删除节点
# update
   改变集群节点状态
复制代码
复制代码
[root@master ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")


# 主要使用availability string

# active
    节点状态正常
# pause
    节点挂起、暂停
# drain
    排除节点,比如将master节点排除,不分配任务,只作为管理节点
复制代码

三、在 Swarm 中部署服务

  1) 创建服务 

复制代码
[root@master ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Options:


Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service''s configuration
  scale       Scale one or multiple replicated service     
复制代码
1
2
3
4
5
[root@master ~] # docker service create --replicas 1 --name hello busybox
 
#  --replicas : 副本集个数
 
# --name:服务名称

  2)查看服务信息

1
2
3
[root@master ~] # docker service ls
ID                   NAME                MODE                REPLICAS            IMAGE               PORTS
kosznwn4ombx        hello               replicated           0 / 1                  busybox:latest

  从 REPLICAS 中能看出这个 hello 服务并没有启动起来,0/1 表示 1 计划启动的副本数,0 实际启动的数量。所以启动失败  

 

  

  3)添加参数

  在 hello 服务中 busybox 只是一个基础镜像,并没有一个持续运行的任务,所以 manager 会不断重启 hello 这个服务,所以有好多 shutdown 的记录。但是可以为其添加一个任务。 

1
2
3
4
5
6
7
8
9
10
[root@master ~] # docker service update --args "ping www.baidu.com" hello
hello
overall progress:  1  out of  1  tasks
1 / 1 : running   [ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >]
verify: Service converged
 
 
# update:更新状态
 
# --args:增加参数

  再次查看状态:

  

  过滤不正常的状态: 

1
2
3
4
5
6
[root@master ~] # docker service ps -f "desired-state=running" hello
ID                   NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
yxyivio4mzlg        hello. 1              busybox:latest      master              Running             Running  4  minutes ago 
 
 
# -f "desired-state=running" : 状态为runngin的服务

  4)为服务扩容(缩融)scale

  刚才设置的 replicas=1,可以增加副本数量

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~] # docker service scale hello=4
 
hello scaled to  4
overall progress:  4  out of  4  tasks
1 / 4 : running  
2 / 4 : running  
3 / 4 : running  
4 / 4 : running  
verify: Service converged
 
 
# scale : 指定服务的数量

  

 

  5)工作节点排除 manager,manager 只作为管理节点

  上图中 manager 也运行了一个服务,将 manager 排除在外

1
2
3
4
5
6
7
8
9
[root@manager ~] # docker node update --availability drain manager
 
# node update : 更改节点状态
 
# --availability : 三种状态
     
    active: 正常
    pause:挂起
    drain:排除

  排除 manager 后,其上面运行的服务会转移到其他节点 

  

 

 四、滚动更新服务

  例如升级服务的镜像版本 

1
2
3
4
5
6
7
8
9
10
[root@manager ~] # docker service create \
- - replicas  3  \
- - name redis \
- - update - delay  10s  \
> redis: 3.0 . 6
 
 
# 启动3个副本集的redis
 
# update-delay 10s :每个容器依次更新,间隔10s

  滚动更新:

1
2
3
docker service update  - - image redis: 3.0 . 7  redis
 
# --image : 指定版本

  更新完成后新版本和历史记录都能查看

  

  查看配置信息:

  

 

 五、服务更新和回滚策略

  1)设置策略  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@manager ~] # docker service create \
- - name my - web \
- - replicas  10  \
- - update - delay  10s  \
- - update - parallelism  2  \
- - update - failure - action  continue  \
- - rollback - parallelism  2  \
- - rollback - monitor  20s  \
- - rollback - max - failure - ratio  0.2  \
nginx: 1.12 . 1
 
 
# --update-parallelism 2  : 每次允许两个服务一起更新
 
#--update-failure-action continue : 更新失败后的动作是继续
 
# --rollback-parallelism 2  :  回滚时允许两个一起
 
# --rollback-monitor 20s  :回滚监控时间20s
 
# --rollback-max-failure-ratio 0.2 : 回滚失败率20%

  如果执行后查看状态不是设置的,可以在 update 一下,将服务状态设置为自己想要的

1
2
3
4
5
docker service update  - - rollback - monitor  20s   my - web
 
docker service update  - - rollback - max - failure - ratio  0.2  my - web
 
# 有两个地方设置数值没有成功,手动设置

  查看状态:

  

  

  2)服务更新

1
[root@manager ~] # docker service update --image nginx:1.13.5 my-web

  和上述策略一致,两两更新

  

   更新完成:

  

  3)手动回滚(策略是失败会回滚,现在没有失败)

  刚才 nginx 版本已经是 1.13.5 了,现在将其还原到 1.12.1 

1
[root@manager ~] # docker service update --rollback my-web

  

29. docker swarm 创建 三个节点 swarm 的集群

29. docker swarm 创建 三个节点 swarm 的集群

1.使用 vagrant 部署 三台 centos/7 的 环境

###Vagrantfile

# -*- mode: ruby -*-

# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

boxes = [

    {

            :name=>"docker-host",

            :eth1=>"192.168.205.10",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8888"

    },

    {

            :name=>"docker-node1",

            :eth1=>"192.168.205.11",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8889"

    },

    {

            :name=>"docker-node2",

            :eth1=>"192.168.205.12",

            :mem=>"1024",

            :cpu=>"1",

            :port=>"8890"

    }

]

Vagrant.configure(2) do |config|

config.vm.box = "centos/7"

boxes.each do |opts|

config.vm.define opts[:name] do |config|

config.vm.hostname = opts[:name]

config.vm.network "forwarded_port", guest: 80, host: opts[:port]

config.vm.provider "vmware_fusion" do |v|

v.vmx["memsize"] = opts[:mem]

v.vmx["numvcpus"] = opts[:cpu]

end

config.vm.provider "virtualbox" do |v|

v.customize ["modifyvm", :id, "--memory", opts[:mem]]

v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]

end

config.vm.network :private_network, ip: opts[:eth1]

end

end

config.vm.synced_folder "./labs", "/home/vagrant/labs"

config.vm.provision "shell", privileged: true, path: "./setup.sh"

end

 

2.编写 setup.sh

 

###setup.sh

 

#/bin/sh

# install some tools

sudo yum install -y wget

sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

sudo yum makecache

sudo yum -y update

sudo yum install -y git vim gcc glibc-static telnet bridge-utils

# install docker

curl -fsSL get.docker.com -o get-docker.sh

sh get-docker.sh

# start docker service

sudo groupadd docker

sudo usermod -aG docker vagrant

sudo systemctl start docker

rm -rf get-docker.sh

sudo tee /etc/docker/daemon.json <<-''EOF''

{

"registry-mirrors": ["https://v2ltjwbg.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

docker version

 

3.创建labs 文件夹 并启动容器

  mkdir  lables

  vagrant up

4. 进去 host 节点

  vagrant ssh docker-host

  声明 manager 节点

  docker swarm init --advertise-addr=192.168.205.10

  只需要 在其他节点运行这段代码 即可 进入这个节点

5. 进入node1节点 并 加入 swarm 集群

  进入docker-node1 节点

    vagrant ssh docker-node1

  运行刚刚生成的代码即可加入 swarm 集群

    docker swarm join --token SWMTKN-1-29cjw98xafo5454juq28ldear34aafbp1n616wilrnjl0q92jz-dt02qoe4nhe98mf6jon9rukca 192.168.205.10:2377

  在 host 节点查看集群节点情况

    docker-host 下

    docker node ls

  docker-node2 节点同理

 

6. 在 docker-machine 上进行 swarm 安装

  docker-machine create swarm-manager

  docker-machine create swarm-node1

  docker-machine create swarm-node2

  同理 加入

7. 在 labs.play-with-docker.com

  常见三个虚拟主机即可运行上面的命令即可

35. docker swarm dockerStack 部署 投票应用

35. docker swarm dockerStack 部署 投票应用

1. 编写 docker-compose.yml

# docker-compose.yml

<style></style>

version: "3"

services:

 

  redis:

    image: redis:alpine

    ports:

      - "6379"

    networks:

      - frontend

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  db:

    image: postgres:9.4

    volumes:

      - db-data:/var/lib/postgresql/data

    networks:

      - backend

    deploy:

      placement:

        constraints: [node.role == manager]

 

  Vote:

    image: dockersamples/examplevotingapp_Vote:before

    ports:

      - 5000:80

    networks:

      - frontend

    depends_on:

      - redis

    deploy:

      replicas: 2

      update_config:

        parallelism: 2

      restart_policy:

        condition: on-failure

 

  result:

    image: dockersamples/examplevotingapp_result:before

    ports:

      - 5001:80

    networks:

      - backend

    depends_on:

      - db

    deploy:

      replicas: 1

      update_config:

        parallelism: 2

        delay: 10s

      restart_policy:

        condition: on-failure

 

  worker:

    image: dockersamples/examplevotingapp_worker

    networks:

      - frontend

      - backend

    deploy:

      mode: replicated

      replicas: 1

      labels: [APP=VOTING]

      restart_policy:

        condition: on-failure

        delay: 10s

        max_attempts: 3

        window: 120s

      placement:

        constraints: [node.role == manager]

 

  visualizer:

    image: dockersamples/visualizer:stable

    ports:

      - "8080:8080"

    stop_grace_period: 1m30s

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      placement:

        constraints: [node.role == manager]

 

networks:

  frontend:

  backend:

 

volumes:

  db-data:

 

2. 启动service  并  查看 service 的状态

  docker stack deploy Vote -c=docker-compose.yml

  docker stack ls

  docker stack services Vote

  docker stack ps Vote

3. 对 Vote_Vote service 进行拓展

  docker service stack scale Vote_Vote=3

 

4. 访问

  访问 192.168.205.10:5000  进行投票

  访问 192.168.205.10:5001  查看投票情况

    访问 192.168.205.10:8080  查看容器 部署情况

 

<style></style>

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

一、需求背景

人生苦短,我用.NET Core!阿笨对Docker是这样评价的:Docker在手,环境我有!Docker出手,集群我有!前面的Doc基础课程我们学习了如何使用Docker来部署搭建单机容器应用。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行。然而,面对 Kubernetes, Mesos等众多容器集群系统,我们该如何选择呢?它们之中,Docker Swarm 是 Docker 原生的,同时也是最简单,最易学,最节省资源的,比较适合中小型公司使用。今天给大家分享一下如何使用Docker-Swarm来搭建负载均衡集群容器环境应用。

1.1、本次分享课程适合人群如下:

1)、本课程一定需要具备Docker基础知识。(零基础学者止步慎入!)

2)、学习和了解ASP.Net Core跨平台开发技术。

3)、喜欢阿笨分享的干货课程童鞋们。本课程不是零基础教学,侧重点主要是讲解Docker Swarm与ASP.NET Core实战运用,大家务必根据自身的实际情况进行选择学习。

如果您在学习过程中遇到任何的课程问题,请先私下直接找阿笨老师进行在线的沟通和交流。谢谢大家的理解和支持,预祝大家学习快乐!

如果您是一个开发老鸟,那么本次课程完全不建议您进行学习!

1.2、一句话总结今天我们学习达到的目标

如何使用Docker-Swarm部署高可用ASP.NET Core负载均衡集群容器环境应用。

如果您同样对本次分享《ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练》课程感兴趣的话,那么请跟着阿笨一起学习吧。废话不多说,直接上干货,我们不生产干货,我们只是干货的搬运工。

1240

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

1240

1240

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

二、Docker-Swarm概念介绍

1、什么是Docker Swarm

2、Docker Swarm核心概念解释

3、DockerSwarm特点

三、Docker-Swarm环境安装

可以通过Docker官方提供的docker-machine来快速创建一个docker容器环境的,它搭建和管理多个docker 主机同时搭建swarm集群。本期分享课程阿笨这里采用是直接模拟通过创建虚拟主机的方式来搭建我们的Docker Swarm集群环境。

Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单。

对于没有集群使用经验的小白,用Docker Swarm起步,是一个很好的选择。Docker 可以看做集装箱把杂乱的货物一个个整理归类, Compose 则是用于编排这些集装箱,最后 Swarm 就是多提供几条船,挂掉一两条还能继续走,提高稳定性。

四、Docker-Swarm搭建ASP.NET Core集群应用环境

1240

ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

五、Docker-Swarm集群部署Nginx实现ASP.NET Core应用负载均衡

1240


ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练

六、思考与总结

【网易云课堂】:点击在线观看

【腾讯课堂】:点击在线观看

【微信公众号】:跟着阿笨一起玩NET

Docker (二十一)-Docker Swarm 集群部署

Docker (二十一)-Docker Swarm 集群部署

介绍

Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。

Swarm 是目前 Docker 官方唯一指定(绑定)的集群管理工具。Docker 1.12 内嵌了 swarm mode 集群管理模式。

Swarm 关键概念

1)Swarm

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

2)Node

一个节点 (node) 是已加入到 swarm 的 Docker 引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着 Manager

管理节点调度任务到 worker 节点,manager 节点还执行维护集群的状态的编排和群集管理功能,worker 节点接收并执行来自

manager 节点的任务。通常,manager 节点也可以是 worker 节点,worker 节点会报告当前状态给 manager 节点

3)服务(Service)

服务是要在 worker 节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像

4)任务(Task)

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

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 查看帮助)

node 是加入到 swarm 集群中的一个 docker 引擎实体,可以在一台物理机上运行多个 node,node 分为:manager nodes 管理节点,worker nodes 工作节点。

 一、系统环境

  1)服务器环境

节点名称 IP 操作系统 内核版本
manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

  2)前提条件

  • Docker 版本 1.12+
  • 集群节点之间保证 TCP 2377、TCP/UDP 7946 和 UDP 4789 端口通信   

    TCP 端口 2377 集群管理端口

    TCP 与 UDP 端口 7946 节点之间通讯端口

    TCP 与 UDP 端口 4789 overlay 网络通讯端口

二、集群部署

  1)master 创建 Swarm(要保存初始化后 token,因为在节点加入时要使用 token 作为通讯的密钥)  

1
2
3
4
5
6
7
8
[root@master ~] # docker swarm init --advertise-addr 172.16.60.95
Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6)  is  now a manager.
 
To add a worker to this swarm, run the following command:
 
     docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377
 
To add a manager to this swarm, run  ''docker swarm join-token manager''  and  follow the instructions. 

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

  使用 docker info 或者 docker node ls 查看集群中的相关信息 

1
2
3
4
5
6
7
8
9
10
11
12
13
docker info
 
.......
Swarm: active
  NodeID: kfi2r4dw6895z5yvhlbyzfck6
  Is Manager: true
  ClusterID: y2zgs373cg0y6559t675yexcj
  Managers:  1
  Nodes:  1
  Orchestration:
   Task History Retention Limit:  5
 
.......

  

  2)添加节点到 swarm 集群中

  所有节点执行 

1
docker swarm join  - - token SWMTKN - 1 - 3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8 - 0mocmawzvm3xge6s37n5a48fw  172.16 . 60.95 : 2377

  在 master 上查看集群节点的状态

  

   到此 Swarm 集群就创建好了

  3)docker  node 命令 

[root@master ~]# docker node --help

Usage:    docker node COMMAND

Manage Swarm nodes

Options:


Commands:
  demote      Demote one or more nodes from manager in the swarm
  inspect     Display detailed information on one or more nodes
  ls          List nodes in the swarm
  promote     Promote one or more nodes to manager in the swarm
  ps          List tasks running on one or more nodes, defaults to current node
  rm          Remove one or more nodes from the swarm
  update      Update a node


# demote
   将管理节点降级为普通节点
# inspect
    查看节点的详细信息
# ls
   列出节点
# promote
   将普通节点升级为管理节点
# ps
   查看运行的任务
# rm
   从swarm集群中删除节点
# update
   改变集群节点状态
[root@master ~]# docker node update --help

Usage:    docker node update [OPTIONS] NODE

Update a node

Options:
      --availability string   Availability of the node ("active"|"pause"|"drain")
      --label-add list        Add or update a node label (key=value)
      --label-rm list         Remove a node label if exists
      --role string           Role of the node ("worker"|"manager")


# 主要使用availability string

# active
    节点状态正常
# pause
    节点挂起、暂停
# drain
    排除节点,比如将master节点排除,不分配任务,只作为管理节点

三、在 Swarm 中部署服务

  1) 创建服务 

[root@master ~]# docker service --help

Usage:    docker service COMMAND

Manage services

Options:


Commands:
  create      Create a new service
  inspect     Display detailed information on one or more services
  logs        Fetch the logs of a service or task
  ls          List services
  ps          List the tasks of one or more services
  rm          Remove one or more services
  rollback    Revert changes to a service''s configuration
  scale       Scale one or multiple replicated service     
1
2
3
4
5
[root@master ~] # docker service create --replicas 1 --name hello busybox
 
#  --replicas : 副本集个数
 
# --name:服务名称

  2)查看服务信息

1
2
3
[root@master ~] # docker service ls
ID                   NAME                MODE                REPLICAS            IMAGE               PORTS
kosznwn4ombx        hello               replicated           0 / 1                  busybox:latest

  从 REPLICAS 中能看出这个 hello 服务并没有启动起来,0/1 表示 1 计划启动的副本数,0 实际启动的数量。所以启动失败  

 

  

  3)添加参数

  在 hello 服务中 busybox 只是一个基础镜像,并没有一个持续运行的任务,所以 manager 会不断重启 hello 这个服务,所以有好多 shutdown 的记录。但是可以为其添加一个任务。 

1
2
3
4
5
6
7
8
9
10
[root@master ~] # docker service update --args "ping www.baidu.com" hello
hello
overall progress:  1  out of  1  tasks
1 / 1 : running   [ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >]
verify: Service converged
 
 
# update:更新状态
 
# --args:增加参数

  再次查看状态:

  

  过滤不正常的状态: 

1
2
3
4
5
6
[root@master ~] # docker service ps -f "desired-state=running" hello
ID                   NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
yxyivio4mzlg        hello. 1              busybox:latest      master              Running             Running  4  minutes ago 
 
 
# -f "desired-state=running" : 状态为runngin的服务

  4)为服务扩容(缩融)scale

  刚才设置的 replicas=1,可以增加副本数量

1
2
3
4
5
6
7
8
9
10
11
12
[root@master ~] # docker service scale hello=4
 
hello scaled to  4
overall progress:  4  out of  4  tasks
1 / 4 : running  
2 / 4 : running  
3 / 4 : running  
4 / 4 : running  
verify: Service converged
 
 
# scale : 指定服务的数量

  

 

  5)工作节点排除 manager,manager 只作为管理节点

  上图中 manager 也运行了一个服务,将 manager 排除在外

1
2
3
4
5
6
7
8
9
[root@manager ~] # docker node update --availability drain manager
 
# node update : 更改节点状态
 
# --availability : 三种状态
     
    active: 正常
    pause:挂起
    drain:排除

  排除 manager 后,其上面运行的服务会转移到其他节点 

  

 

 四、滚动更新服务

  例如升级服务的镜像版本 

1
2
3
4
5
6
7
8
9
10
[root@manager ~] # docker service create \
- - replicas  3  \
- - name redis \
- - update - delay  10s  \
> redis: 3.0 . 6
 
 
# 启动3个副本集的redis
 
# update-delay 10s :每个容器依次更新,间隔10s

  滚动更新:

1
2
3
docker service update  - - image redis: 3.0 . 7  redis
 
# --image : 指定版本

  更新完成后新版本和历史记录都能查看

  

  查看配置信息:

  

 

 五、服务更新和回滚策略

  1)设置策略  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@manager ~] # docker service create \
- - name my - web \
- - replicas  10  \
- - update - delay  10s  \
- - update - parallelism  2  \
- - update - failure - action  continue  \
- - rollback - parallelism  2  \
- - rollback - monitor  20s  \
- - rollback - max - failure - ratio  0.2  \
nginx: 1.12 . 1
 
 
# --update-parallelism 2  : 每次允许两个服务一起更新
 
#--update-failure-action continue : 更新失败后的动作是继续
 
# --rollback-parallelism 2  :  回滚时允许两个一起
 
# --rollback-monitor 20s  :回滚监控时间20s
 
# --rollback-max-failure-ratio 0.2 : 回滚失败率20%

  如果执行后查看状态不是设置的,可以在 update 一下,将服务状态设置为自己想要的

1
2
3
4
5
docker service update  - - rollback - monitor  20s   my - web
 
docker service update  - - rollback - max - failure - ratio  0.2  my - web
 
# 有两个地方设置数值没有成功,手动设置

  查看状态:

  

  

  2)服务更新

1
[root@manager ~] # docker service update --image nginx:1.13.5 my-web

  和上述策略一致,两两更新

  

   更新完成:

  

  3)手动回滚(策略是失败会回滚,现在没有失败)

  刚才 nginx 版本已经是 1.13.5 了,现在将其还原到 1.12.1 

1
[root@manager ~] # docker service update --rollback my-web

  

  手动回滚成功

关于Docker Swarm 集群部署docker swarm集群搭建的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于29. docker swarm 创建 三个节点 swarm 的集群、35. docker swarm dockerStack 部署 投票应用、ASP.NET Core使用Docker-Swarm集群部署实现负载均衡实战演练、Docker (二十一)-Docker Swarm 集群部署的相关信息,请在本站寻找。

本文标签: