zoukankan      html  css  js  c++  java
  • Docker Swarm 日常运维命令笔记

     

    之前介绍了Docker管理工具-Swarm部署记录,这里简单总结下Docker Swarm的日常维护命令,以作为平时运维笔记.

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

    Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。Swarm架构图可以让大家对Swarm有一个初步的认识,比如Swarm的具体工作流程:Docker Client发送请求给Swarm;Swarm处理请求并发送至相应的Docker Node;Docker Node执行相应的操作并返回响应。除此之外,Swarm的工作原理依然还不够明了。深入理解Swarm的工作原理,可以先从Swarm提供的命令入手。Swarm支持的命令主要有4个:swarm create、swarm manage、swarm join、swarm list。当然还有一个swarm help命令,该命令用于指导大家如何正确使用swarm命令.

    swarm create
    Swarm中swarm create命令用于创建一个集群标志,用于Swarm管理Docker集群时,Docker Node的节点发现功能。发起该命令之后,Swarm会前往Docker Hub上内建的发现服务中获取一个全球唯一的token,用以唯一的标识Swarm管理的Docker集群。

    swarm manage
    Swarm中swarm manage是最为重要的管理命令。一旦swarm manage命令在Swarm节点上被触发,则说明用户需要swarm开始管理Docker集群。从运行流程的角度来讲,swarm经历的阶段主要有两点:启动swarm、接收并处理Docker集群管理请求。

    Swarm启动的过程包含三个步骤:
    ► 发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化;
    ► 初始化内部调度(scheduler)模块;
    ► 创建并启动API监听服务模块;

    第一个步骤,Swarm发现Docker集群中的节点。发现(discovery)是Swarm中用于维护Docker集群状态的机制。既然涉及到发现(discovery),那在这之前必须先有注册(register)。Swarm中有专门负责发现(discovery)的模块,而关于注册(register)部分,不同的discovery模式下,注册(register)也会有不同的形式。

    目前,Swarm中提供了5种不同的发现(discovery)机制:Node Discovery、File Discovery、Consul Discovery、EtcD Discovery和Zookeeper Discovery。

    第二个步骤,Swarm内部的调度(scheduler)模块被初始化。swarm通过发现机制发现所有注册的Docker Node,并收集到所有Docker Node的状态以及具体信息。此后,一旦Swarm接收到具体的Docker管理请求,Swarm需要对请求进行处理,并通过所有Docker Node的状态以及具体信息,来筛选(filter)决策到底哪些Docker Node满足要求,并通过一定的策略(strategy)将请求转发至具体的一个Docker Node。

    第三个步骤,Swarm创建并初始化API监听服务模块。从功能的角度来讲,可以将该模块抽象为Swarm Server。需要说明的是:虽然Swarm Server完全兼容Docker的API,但是有不少Docker的命令目前是不支持的,毕竟管理Docker集群与管理单独的Docker会有一些区别。当Swarm Server被初始化并完成监听之后,用户即可以通过Docker Client向Swarm发送Docker集群的管理请求。

    Swarm的swarm manage接收并处理Docker集群的管理请求,即是Swarm内部多个模块协同合作的结果。请求入口为Swarm Server,处理引擎为Scheduler,节点信息依靠Disocovery。

    swarm join
    Swarm的swarm join命令用于将Docker Node添加至Swarm管理的Docker集群中。从这点也可以看出swarm join命令的执行位于Docker Node,因此在Docker Node上运行该命令,首先需要在Docker Node上安装Swarm,由于该Swarm只会执行swarm join命令,故可以将其当成Docker Node上用于注册的agent模块。

    功能而言,swarm join可以认为是完成Docker Node在Swarm节点处的注册(register)工作,以便Swarm在执行swarm manage时可以发现该Docker Node。然而,上文提及的5种discovery模式中,并非每种模式都支持swarm join命令。不支持的discovery的模式有Node Discovery与File Discovery。

    Docker Node上swarm join执行之后,标志着Docker Node向Swarm注册,请求加入Swarm管理的Docker集群中。Swarm通过注册信息,发现Docker Node,并获取Docker Node的状态以及具体信息,以便处理Docker请求时作为调度依据。

    swarm list
    Swarm中的swarm list命令用以列举Docker集群中的Docker Node。Docker Node的信息均来源于Swarm节点上注册的Docker Node。而一个Docker Node在Swarm节点上注册,仅仅是注册了Docker Node的IP地址以及Docker监听的端口号。

    使用swarm list命令时,需要指定discovery的类型,类型包括:token、etcd、file、zk以及。而swarm list并未罗列Docker集群的动态信息,比如Docker Node真实的运行状态,或者Docker Node在Docker集群中扮演的角色信息。

    ==========================下面简单梳理了一些日常运维中用到的Swarm相关命令=============================

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    1) 初始化swarm manager并制定网卡地址
    # docker swarm init --advertise-addr 182.48.115.237
     
    2) 删除集群,强制退出需要加–force (针对manager节点). 到各个节点上执行退出集群的命令
    # docker node rm swarm-node1    
    # docker swarm leave --force      //manager节点退出集群,需要加--force
     
    3) 查看swarm worker的连接令牌
    # docker swarm join-token worker
     
    例如:
    [root@manager-node ~]# docker swarm init --advertise-addr 182.48.115.237
    Swarm initialized: current node (1gi8utvhu4rxy8oxar2g7h6gr) is now a manager.
      
    To add a worker to this swarm, run the following command:
      
        docker swarm join
        --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej
        182.48.115.237:2377
      
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
     
    4)  加入docker swarm集群,作为worker节点
    利用上面执行结果中的命令放在其他节点上执行,则该节点加入到swarm集群中作为worker节点
    [root@node1 ~]# docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377
    This node joined a swarm as a worker.
     
    5) 查看swarm manager的连接令牌
    # docker swarm join-token manager
     
    例如:
    [root@swarm-manager-node ~]# docker swarm join-token manager
    To add a manager to this swarm, run the following command:
     
        docker swarm join
        --token SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su
        172.16.60.220:2377
     
    6) 加入docker swarm集群,作为manager节点
    利用上面执行结果中的命令放在其他节点上执行,则该节点加入到swarm集群中作为manager管理节点,状态为reachable.
    [root@swarm-manager-node2 ~]# docker swarm join --token SWMTKN-1-075gaitl18z3v0p37sx7i5cmvzjjur0fbuixzp4tun0xh0cikd-0y8ttp5h0g54j10amn670w6su 172.16.60.220:2377
    This node joined a swarm as a manager.
     
    [root@swarm-manager-node2 ~]# docker node ls
    ID                                                HOSTNAME                  STATUS      AVAILABILITY  MANAGER STATUS
    rpbey5t1v14olke2mgtc430de     swarm-node2                 Ready        Active       
    u6gkfr4j19gq16ddyb76fxsl3       swarm-node1                 Ready        Active       
    vwbb0imil512a1le04bnkx98u *   swarm-manager-node    Ready       Active                      Leader
    ybjvaszg838upeqvvzswhq0tt       swarm-manager-node2  Ready       Active                      Reachable
     
    如果之前的leader状态的manager管理节点挂了后(假如systemctl stop docker, 然后再systemctl start docker),
    则新加入的manager节点状态由reachable变为leader, 之前的manager节点状态为unreachable.
    [root@swarm-manager-node2 ~]# docker node ls
    ID                                                HOSTNAME                  STATUS      AVAILABILITY  MANAGER STATUS
    rpbey5t1v14olke2mgtc430de     swarm-node2                 Ready        Active       
    u6gkfr4j19gq16ddyb76fxsl3       swarm-node1                 Ready        Active       
    vwbb0imil512a1le04bnkx98u *   swarm-manager-node    Ready       Active                      Unreachable
    ybjvaszg838upeqvvzswhq0tt       swarm-manager-node2  Ready       Active                      Leader
     
    7) 使旧令牌无效并生成新令牌
    # docker swarm join-token --rotate
     
    8) 查看集群中的节点
    # docker node ls
     
    9) 查看集群中节点信息
    # docker node inspect swarm-node1 --pretty
     
    10) 调度程序可以将任务分配给节点
    # docker node update --availability active swarm-node1
     
    11) 调度程序不向节点分配新任务,但是现有任务仍然保持运行
    # docker node update --availability pause swarm-node1
     
    12) 调度程序不会将新任务分配给节点。调度程序关闭任何现有任务并在可用节点上安排它们. 也就是线下节点,不参与任务分配.
    # docker node update --availability drain swarm-node1
     
    13) 添加节点标签
    # docker node update --label-add label1 --label-add bar=label2 swarm-node1
     
    14) 删除节点标签
    # docker node update --label-rm label1 swarm-node1
     
    15) 将worker节点升级为manager节点
    # docker node promote swarm-node1
     
    16) 将manager节点降级为worker节点
    # docker node demote swarm-manager-node
     
    17) 查看服务列表
    # docker service ls
     
    18) 查看服务的具体信息
    # docker service ps my-test
     
    19) 创建一个不定义name,不定义replicas的服务. (如下的nginx是docker的nginx镜像名称,不是服务名称)
    # docker service create nginx
     
    20) 创建一个指定name的服务
    # ocker service create --name my-nginx nginx
     
    21) 创建一个指定name、run cmd的服务
    # docker service create --name my-nginx nginx ping www.baidu.com
     
    22) 创建一个指定name、version、run cmd的服务
    # docker service create --name my-redis redis:3.0.6
    # docker service create --name my-nginx nginx:1.8 /bin/bash
     
    23) 创建一个指定name、port、replicas的服务
    # docker service create --name my-nginx --replicas 3 -p 80:80 nginx
     
    24) 为指定的服务更新一个端口
    # docker service update --publish-add 80:80 my-nginx
     
    25) 为指定的服务删除一个端口
    # docker service update --publish-rm 80:80 my-nginx
     
    26) 将redis:3.0.6更新至redis:3.0.7
    # docker service update --image redis:3.0.7 redis
     
    27) 配置运行环境,指定工作目录及环境变量
    # docker service create --name my-nginx --env MYVAR=myvalue --workdir /data/www --user my_user nginx ping www.baidu.com
     
    28) 创建一个my-nginx的服务
    # docker service create --name my-nginx nginx ping www.baidu.com
     
    29) 更新my-nginx服务的运行命令
    # docker service update --args "ping www.baidu.com" my-nginx
     
    30) 删除一个服务
    # docker service rm my-nginx
     
    31) 在每个群组节点上运行web服务
    # docker service create --name tomcat --mode global --publish mode=host,target=8080,published=8080 tomcat:latest
     
    32) 创建一个overlay网络
    # docker network create --driver overlay my-network
    # docker network create --driver overlay --subnet 10.10.10.0/24 --gateway 10.10.10.1 haha-network
     
    33) 创建服务并将网络添加至该服务
    # docker service create --name my-test --replicas 3 --network my-network redis
     
    34) 删除群组网络
    # docker service update --network-rm my-network my-test
     
    35) 更新群组网络
    # docker service update --network-add haha-network my-test
     
    36) 创建群组并配置cpu和内存
    # docker service create --name my_nginx --reserve-cpu 2 --reserve-memory 512m --replicas 3 nginx
     
    37) 更改所分配的cpu和内存
    # docker service update --reserve-cpu 1 --reserve-memory 256m my_nginx
     
    38) 创建服务时自定义的几个参数
    指定每次更新的容器数量
    --update-parallelism
     
    指定容器更新的间隔
    --update-delay
     
    定义容器启动后监控失败的持续时间
    --update-monitor
     
    定义容器失败的百分比
    --update-max-failure-ratio
     
    定义容器启动失败之后所执行的动作
    --update-failure-action
     
    比如:创建一个服务并运行3个副本,同步延迟10秒,10%任务失败则暂停
    # docker service create --name mysql_5_6_36 --replicas 3 --update-delay 10s --update-parallelism 1 --update-monitor 30s --update-failure-action pause --update-max-failure-ratio 0.1 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
     
    39) 回滚至之前版本
    # docker service update --rollback mysql
     
    自动回滚
    如果服务部署失败,则每次回滚2个任务,监控20秒,回滚可接受失败率20%
    # docker service create --name redis --replicas 6 --rollback-parallelism 2 --rollback-monitor 20s --rollback-max-failure-ratio .2 redis:latest
     
    40) 创建服务并将目录挂在至container中
    # docker service create --name mysql --publish 3306:3306 --mount type=bind,src=/data/mysql,dst=/var/lib/mysql --replicas 3 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.36
     
    需要注意使用bind绑定宿主机目录会带来的风险
    - 绑定的主机路径必须存在于每个集群节点上,否则会有问题;
    - 调度程序可能会在任何时候重新安排运行服务容器,如果目标节点主机变得不健康或无法访问;
    - 主机绑定数据不可移植,当你绑定安装时,不能保证你的应用程序开发方式与生产中的运行方式相同;
     
    41) 添加swarm配置
    # echo "this is a mysql config" | docker config create mysql -
     
    42) 查看配置
    # docker config ls
     
    查看配置详细信息
    # docker config inspect mysql
     
    43) 删除配置
    # docker config rm mysql
     
    44) 添加配置
    # docker service update --config-add mysql mysql
     
    45) 删除配置
    # docker service update --config-rm mysql mysql
     
    46) 添加配置
    # docker config create kevinpage index.html
     
    47) 启动容器的同时添加配置(target如果报错,就使用dst或destination)
    # docker service create --name nginx --publish 80:80 --replicas 3 --config src=kevinpage,target=/usr/share/nginx/html/index.html nginx
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    MySql行锁等待时间
    日志工具类-Mapper静态调用
    MySql锁机制理解记录
    Flink之TableAPI和SQL(5):表的时间特性
    Flink之TableAPI和SQL(4):表的Sink实现
    Flink之TableAPI和SQL(3):通过TableAPI和SQL表的一些操作(包括查询,过滤,聚集等)
    Flink之TableAPI和SQL(2):表和外部系统的连接方式
    Flink之TableAPI和SQL(1):基本功能描述
    sb 错误
    洛谷 P6189
  • 原文地址:https://www.cnblogs.com/lcword/p/14539783.html
Copyright © 2011-2022 走看看