zoukankan      html  css  js  c++  java
  • docker swarm集群

    swarm介绍
    Swarm这个项目名称特别贴切。在Wiki的解释中,Swarm behavior是指动物的群集行
    为。比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavior
    Swarm项目正是这样,通过把多个Docker Engine聚集在一起,形成一个大的dockerengine

    对外提供容器的集群服务。同时这个集群对外提供Swarm API(命令,docker
    engine的命令),用户可以像使用Docker Engine一样使用Docker集群。

     SwarmDocker公司在201412月初发布的容器管理工具,和Swarm一起发布的
    Docker管理工具还有Machine以及ComposeSwarm是一套较为简单的工具,用以管理
    Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm将一群
    Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其
    前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py,
    docker)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,Swarm0.2
    版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支

     持更多的Docker命令以及集群驱动。Swarm deamon只是一个调度器(Scheduler)加
    路由器(router)Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,
    调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节
    点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。
    docker swarm特点:
    1) 对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine
    则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。
    2) Swarm对用户来说,之前使用Docker的经验可以继承过来。非常容易上手,学习成本
    和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资
    源也非常少。简单说,就是插件化机制,Swarm中的各个模块都抽象出了API,可以根据
    自己一些特点进行定制实现。
    3) Swarm自身对Docker命令参数支持的比较完善,Swarm目前与Docker是同步发布
    的。Docker的新功能,都会第一时间在Swarm中体现。 

     docker swarm架构
    Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm
    署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker

     

     

     相关术语:
    Swarm Manager:集群的管理工具,通过swarm manager管理多个节点。
    Node:是已加入到swarmDocker引擎的实例 。

    manager nodes:也就是管理节点 ,执行集群的管理功能,维护集群的状态,选举一个leader节点去执 行调度任务
    worker nodes,也就是工作节点 ,接收和执行任务。参与容器集群负载调度,仅用于承载task 

    一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。

    Task 任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务

     docker swarm 使用

     1、准备3台服务器的docker的Engine都要启动起来

    [root@iZ1la3d1xbmukrZ ~]# docker version
    Client: Docker Engine - Community
     Version:           19.03.6
     API version:       1.40
     Go version:        go1.12.16
     Git commit:        369ce74a3c
     Built:             Thu Feb 13 01:29:29 2020
     OS/Arch:           linux/amd64
     Experimental:      false
    
    Server: Docker Engine - Community
     Engine:
      Version:          19.03.6
      API version:      1.40 (minimum version 1.12)
      Go version:       go1.12.16
      Git commit:       369ce74a3c
      Built:            Thu Feb 13 01:28:07 2020
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.2.10
      GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
     runc:
      Version:          1.0.0-rc8+dev
      GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
     docker-init:
      Version:          0.18.0
      GitCommit:        fec3683

    2、创建docker swarm
    2.1、在manager1机器上创建docker swarm集群

    [root@iZ1la3d1xbmukrZ ~]# docker swarm init --advertise-addr 47.121.241.234
    Swarm initialized: current node (5lvshpdvycfuv4n5ttv77oz5j) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-4gmv8ipiixa4xb3zgrz5aua56eprw4qaabda1k3tn54v10ilzd-edo2wqymfona1wpqcivbj7pb9 47.121.241.234:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

    (‐‐advertise‐addr将该IP地址的机器设置为集群管理节点;如果是单节点,无需该参数)
    2.2、查看管理节点集群信息:

    [root@iZ1la3d1xbmukrZ ~]# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5lvshpdvycfuv4n5ttv77oz5j *   iZ1la3d1xbmukrZ     Ready               Active              Leader              19.03.6

    3、向docker swarm中添加工作节点:在两个工作节点中分别执行如下命令,ip地址是manager节点的
    3.1、添加两个work节点

    [root@iZbp143t3oxhfc3ar7jey0Z redis-4.0.12]#  docker swarm join --token SWMTKN-1-4gmv8ipiixa4xb3zgrz5aua56eprw4qaabda1k3tn54v10ilzd-edo2wqymfona1wpqcivbj7pb9 47.121.241.234:2377
    This node joined a swarm as a worker.
    [root@iZbp143t3oxhfc3ar7jey0Z redis-4.0.12]#

    (‐‐token xxx:向指定集群中加入工作节点的认证信息,xxx认证信息是在创建dockerswarm时产生的)
    3.2、继续查看管理节点集群信息与之前的区别

    [root@iZ1la3d1xbmukrZ ~]# docker node ls
    ID                            HOSTNAME                  STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    5lvshpdvycfuv4n5ttv77oz5j *   iZ1la3d1xbmukrZ           Ready               Active              Leader              19.03.6
    di1pxwo7teaeptbpm8f5aqtvh     iZbp143t3oxhfc3ar7jey0Z   Ready               Active                                  18.03.1-ce
    x4c215lb3vdk6at37anaxque0     iZbp145axkc98giot5b448Z   Ready               Active                                  18.03.1-ce

    4、在docker swarm中部署服务
    在Docker Swarm集群中部署服务时,既可以使用Docker Hub上自带的镜像来启动服务,也

    可以使用自己通Dockerfile构建的镜像来启动服务。如果使用自己通过Dockerfile构建的
    镜像来启动服务那么必须先将镜像推送到Docker Hub中心仓库。为了方便读者的学习,这里
    以使用Docker Hub上自带的alpine镜像为例来部署集群服务
    4.1、部署服务

    [root@iZ1la3d1xbmukrZ ~]# docker service create --replicas 1 --name helloworld alpine ping docker.com
    x2yn2y8e0qnthadj7qn3xtjy6
    overall progress: 1 out of 1 tasks
    1/1: running   [==================================================>]
    verify: Service converged

    docker service create指令:用于在Swarm集群中创建一个基于alpine镜像的服务
    ‐‐replicas参数:指定了该服务只有一个副本实例
    ‐‐name参数:指定创建成功后的服务名称为helloworld
    ping docker.com指令:表示服务启动后执行的命令
    5.查看docker swarm集群中的服务
    查看服务列表:docker service ls
    查看部署具体服务的详细信息:docker service inspect 服务名称
    查看服务在集群节点上的分配以及运行情况:docker service ps 服务名称

    [root@iZ1la3d1xbmukrZ ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    x2yn2y8e0qnt        helloworld          replicated          1/1                 alpine:latest
    [root@iZ1la3d1xbmukrZ ~]# docker service inspect x2yn2y8e0qnt
    [
        {
            "ID": "x2yn2y8e0qnthadj7qn3xtjy6",
            "Version": {
                "Index": 21
            },
            "CreatedAt": "2020-03-21T13:04:15.980807455Z",
            "UpdatedAt": "2020-03-21T13:04:15.980807455Z",
            "Spec": {
    [root@iZ1la3d1xbmukrZ ~]# docker service ps x2yn2y8e0qnt
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
    ya0ic0wmkmyj        helloworld.1        alpine:latest       iZ1la3d1xbmukrZ     Running             Running 52 seconds ago

    6、修改副本数量
    在manager1上,更改服务副本的数量(创建的副本会随机分配到不同的节点)

    [root@iZ1la3d1xbmukrZ ~]# docker service scale helloworld=5
    helloworld scaled to 5
    overall progress: 5 out of 5 tasks
    1/5: running   [==================================================>]
    2/5: running   [==================================================>]
    3/5: running   [==================================================>]
    4/5: running   [==================================================>]
    5/5: running   [==================================================>]
    verify: Service converged
    [root@iZ1la3d1xbmukrZ ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    x2yn2y8e0qnt        helloworld          replicated          5/5                 alpine:latest
    [root@iZ1la3d1xbmukrZ ~]# docker service ps x2yn2y8e0qnt
    ID                  NAME                IMAGE               NODE                      DESIRED STATE       CURRENT STATE             ERROR                       PORTS
    ya0ic0wmkmyj        helloworld.1        alpine:latest       iZ1la3d1xbmukrZ           Running             Running 2 minutes ago
    otwisu2kyd7o        helloworld.2        alpine:latest       iZ1la3d1xbmukrZ           Running             Running 25 seconds ago
    zik6r6dgmhlh         \_ helloworld.2    alpine:latest       iZbp145axkc98giot5b448Z   Shutdown            Assigned 49 seconds ago
    rys98fq9j1a9        helloworld.3        alpine:latest       iZ1la3d1xbmukrZ           Running             Running 18 seconds ago
    t4li1x7sddfj         \_ helloworld.3    alpine:latest       iZ1la3d1xbmukrZ           Shutdown            Failed 23 seconds ago     "task: non-zero exit (1)"
    gabl7dt41rvi         \_ helloworld.3    alpine:latest       iZbp145axkc98giot5b448Z   Shutdown            Assigned 49 seconds ago
    2iru00kr317b        helloworld.4        alpine:latest       iZ1la3d1xbmukrZ           Running             Running 49 seconds ago
    9atnxtatg0jt        helloworld.5        alpine:latest       iZ1la3d1xbmukrZ           Running             Running 21 seconds ago
    gz8j86axe31m         \_ helloworld.5    alpine:latest       iZbp145axkc98giot5b448Z   Shutdown            Assigned 31 seconds ago
    ph6uc3fe63ui         \_ helloworld.5    alpine:latest       iZbp143t3oxhfc3ar7jey0Z   Shutdown            Assigned 49 seconds ago

    7、删除服务(在管理节点)

    [root@iZ1la3d1xbmukrZ ~]# docker service rm helloworld
    helloworld

    8、访问服务
    8.1、查看集群环境下的网络列表:

    [root@iZ1la3d1xbmukrZ ~]# docker network ls
    NETWORK ID          NAME                  DRIVER              SCOPE
    13143a2ccae6        bridge                bridge              local
    4efdb0be3651        docker_gwbridge       bridge              local
    56aa491f712e        host                  host                local
    b1jvzriu9u1j        ingress               overlay             swarm
    cc6a477b93cf        none                  null                local
    d311f0917bd1        yearning-go_default   bridge              local

    8.2、在manager1上创建一overlay为驱动的网络(默认使用的网络连接ingress)

    [root@iZ1la3d1xbmukrZ ~]# docker network create -d=overlay host-network
    k8x8k7adous14ju4ferhf19i1

    8.3、在集群管理节点manager1上部署一个nginx服务

    [root@iZ1la3d1xbmukrZ ~]# docker service create 
    >  -- network host-network 
    >  -- name web 
    >  -p 8080:80 
    >  -- replicas 2 
    > nginx
    image network:latest could not be accessed on a registry to record
    its digest. Each node will access network:latest independently,
    possibly leading to different nodes running different
    versions of the image.
    
    4clcqob1ts1s3eeo67x6432kv
    overall progress: 0 out of 1 tasks
    1/1: preparing [=================================>                 ]

    8.4、访问测试

  • 相关阅读:
    Java NIO类库Selector机制解析(上)
    SWT Display.getDefault() 和Display.getCurrent()的区别
    VSS 2005 复位 工作目录(Reset Working Folder)
    转:理解javascript中的delete机制(2)
    在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
    CSS样式
    Character Animator不显示NDI无法OBS直播
    【LoadRunner】基础使用教程:录制第一个脚本(包含遇到的错误问题解决)
    流式传输 之四流式协议
    全局变量,静态变量,局部变量
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12542469.html
Copyright © 2011-2022 走看看