zoukankan      html  css  js  c++  java
  • Docker之路-容器编排SWARM

    swarm mode 介绍

    Docker Swarm 是 Docker 官方容器编排项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

    使用它,用户可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机,快速打造一套容器云平台。

    Docker 1.12.0之后的版本中,已经将swarm内嵌入docker引擎了,变成了docker的子命令docker swarm

    swarm mode内置了KV存储功能, 提供了众多的新特性,具有容错能力的去中心化设计,内置服务发现、负载均衡、路由网络、动态伸缩、滚动更新、安全传输等。

    swarm的基本概念

    Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。

    使用 Swarm 集群之前需要了解以下几个概念。

    节点

    运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。

    节点分为管理 (manager) 节点和工作 (worker) 节点。

    管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leaderleader 通过 raft 协议实现。

    工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

    来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系。

    img

    服务和task

    任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

    服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

    • replicated services 按照一定规则在各个工作节点上运行指定个数的任务。
    • global services 每个工作节点上运行一个任务

    两种模式通过 docker service create--mode 参数指定。

    来自 Docker 官网的这张图片形象的展示了容器、任务、服务的关系。

    img

    创建swarm集群

    通过前面的简单介绍,我们知道swarm是由管理节点和工作节点组成的,即leader和follower组成,我们选选取一台主机作为swarm的管理节点,在管理节点上执行命令将自己初始化为管理节点(前提是,该主机必须安装了docker环境),等待其他节点的加入:

    [root@node1 ~]# docker swarm init
    Swarm initialized: current node (z450zeu3ul9pcggml756lip0w) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    从init之后,给出了如何加入的方法。直接在其他节点上执行即可将主机添加到swarm集群中:

    [root@node2 ~]# docker swarm join --token SWMTKN-1-4kuadn332c96u11gojm6575400eh0m2gmsf7r4nkirdy9op0ka-6kblnv1n1thj8hyozo3fax1ri 10.100.1.123:2377
    This node joined a swarm as a worker.
    

    可以在管理节点查看整个集群的节点信息:

    [root@node1 ~]# docker node ls
    ID                            HOSTNAME      STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    tuiqjpehjq9sthd77npydr8qv     node2   		Ready               Active                                  19.03.2
    z450zeu3ul9pcggml756lip0w *   node1   		Ready               Active              Leader              19.03.2
    

    在swarm上部署服务

    我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。我们使用 docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。

    我们在swarm上创建一个nginx服务:

    [root@node1 ~]# docker service create --replicas 2 -p 8080:80 --name webnginx nginx
    01zq6lp7oyxdgbvw7l34n6j9u
    overall progress: 2 out of 2 tasks
    1/2: running   [==================================================>]
    2/2: running   [==================================================>]
    verify: Service converged
    

    使用 docker service ls 来查看当前 Swarm 集群运行的服务。

    [root@node1 ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    01zq6lp7oyxd        webnginx            replicated          2/2                 nginx:latest        *:8080->80/tcp
    

    我们分别在管理节点和从节点访问下8080端口,然后可以看看日志:

    [root@node1 ~]# docker service logs webnginx
    webnginx.1.rf2e15kitl28@node1    | 10.255.0.3 - - [17/Oct/2019:05:27:19 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
    webnginx.2.35miixmebucu@node2    | 10.255.0.2 - - [17/Oct/2019:05:26:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.43.0" "-"
    

    swars进行服务伸缩

    我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。

    当业务处于高峰期时,我们需要扩展服务运行的容器数量。

    [root@node1 ~]# docker service scale webnginx=5
    webnginx 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@node1 ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    01zq6lp7oyxd        webnginx            replicated          5/5                 nginx:latest        *:8080->80/tcp
    

    从上面可以看到副本数量变成了5个。

    当业务平稳时,我们需要减少服务运行的容器数量。

    [root@node1 ~]# docker service scale webnginx=1
    webnginx scaled to 1
    overall progress: 1 out of 1 tasks
    1/1: running   [==================================================>]
    verify: Service converged
    [root@node1 ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    01zq6lp7oyxd        webnginx            replicated          1/1                 nginx:latest        *:8080->80/tcp
    

    删除swarm启动的服务,发现容器也销毁了:

    [root@node1 ~]# docker service rm webnginx
    webnginx
    [root@node1 ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    [root@node1 ~]# docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    

    总结

    # 集群管理
    docker swarm init
    docker swarm join --token <token> 
    
    # 节点管理
    docker node [options]
    
    # 服务管理
    docker service create ...
    docker service ls
    docker service logs ...
    docker service rm ...
    
    
  • 相关阅读:
    Python open 读和写
    Sublime Text的使用
    解决MySQL Workbench导出乱码问题
    统计学(一)
    pymysql使用(二)
    使用pymysql(使用一)
    2个Excel表格核对技巧
    用Python读写Excel文件的方式比较
    从零上手Python关键代码
    php面试
  • 原文地址:https://www.cnblogs.com/vinsent/p/11691562.html
Copyright © 2011-2022 走看看