之前介绍了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) 初始化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

Docker Swarm 日常运维命令笔记的更多相关文章

  1. hadoop记录-hadoop集群日常运维命令

    hadoop集群日常运维命令 #1.namenode hadoop namenode -format #格式化,慎用 su hdfs hadoop-daemon.sh start namenode h ...

  2. gitlab 日常运维命令

    2018-10-24 gitlab查看版本 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION 查看gitlab服务状态命令 gitlab-ct ...

  3. ogg日常运维命令

    1.查看历史记录.快捷执行历史中的一条命令 GGSCI (11g) 32> h 23: view param exta24: info all25: lag exta.... GGSCI (11 ...

  4. AIX—日常运维命令总结

    1. 查看AIX服务器的物理构造信息,包括服务器网络配置信息 # prtconf # ifconfig -a # lsattr -E -l mem0 :查看系统内存大小 # netstat -in : ...

  5. Linux运维命令笔记一

     1.Centos 无netstat 命令 yum -y install net-toolnetstat -tunp  2.Centos防火墙 systemctl stop firewalld.ser ...

  6. Jenkins日常运维笔记-重启数据覆盖问题、迁移、基于java代码发版(maven构建)

    之前在公司机房部署了一套jenkins环境,现需要迁移至IDC机房服务器上,迁移过程中记录了一些细节:1)jenkins默认的主目录放在当前用户家目录路径下的.jenkins目录中.如jenkins使 ...

  7. 老司机实战Windows Server Docker:4 单节点Windows Docker服务器简单运维(下)

    上篇中,我们主要介绍了使用docker-compose对Windows Docker单服务器进行远程管理,编译和部署镜像,并且设置容器的自动启动.但是,还有一些重要的问题没有解决,这些问题不解决,就完 ...

  8. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...

  9. zookeeper 用法和日常运维

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...

随机推荐

  1. hdu 5059 简单字符串处理

    http://acm.hdu.edu.cn/showproblem.php?pid=5059 确定输入的数是否在(a,b)内 简单字符串处理 #include <cstdio> #incl ...

  2. 求n得阶乘得最后一位非零数字

    如题,最后一位数好求,他只和最后一位相乘后的最后一位有关,唯一影响我们得是末尾0,而阶乘中末尾0来自于2和5,(10得话可以看成2 * 5),所以有这个思想我们可以筛选出1 * 2 * 3 * ... ...

  3. php excel

    项目中需要把excel转为索引数组,不输出key 只说下普世技巧 找了php excel插件 发现需要createReader方法,在sublime中search,可以搜索文件内容,找到使用creat ...

  4. AngularJS 路由 resolve属性

    当路由切换的时候,被路由的页面中的元素(标签)就会立马显示出来,同时,数据会被准备好并呈现出来.但是注意,数据和元素并不是同步的,在没有任何设置的情况下,AngularJS默认先呈现出元素,而后再呈现 ...

  5. AngularJs 指令中 的Scope属性

    一.概念说明 可以是true. false .哈希对象 {} 1.true 新创建了一个作用域,且继承了父作用域:在初始化的时候,用了父作用域的属性和方法去填充我们这个新的作用域.它和父作用域不是同一 ...

  6. 创建窗口句柄时出错(error creating window handle)

    创建窗口句柄错误.这个错误非常头疼,难以排查,我从网络上搜集了一些排查方案. 可能的原因: 窗口句柄泄露,句柄数超过1W. 用户对象超过1W,错误提示"当前程序已使用了 Window 管理器 ...

  7. Android 使用 NYTimes Stores 缓存 network request

    NYTimes Stores 是一个缓存库,在 2017年的 AndroidMakers 大会上被介绍过. https://github.com/NYTimes/Store 实现一个 Disk Cac ...

  8. API网关【gateway 】- 2

    最近在公司进行API网关重写,公司内采用serverMesh进行服务注册,调用,这里结合之前学习对API网关服务进行简单的总结与分析. 由于采用了大量的nginx相关的东西,所以在此记录一下: 配置连 ...

  9. ssh远程连接不上linux

    远程连接工具是:Xmanager Enterprise 5-->Xshell linux 发行版本是:CentOS-6.3-x86_64 问题:ssh一直都可以远程连接上linux,一段时间后突 ...

  10. Shell - 简明Shell入门10 - 管道(Pipe)

    示例脚本及注释 #!/bin/bash echo '##### Number of *.conf : ' find /etc -name *.conf | grep system | wc -l ec ...