• swarm1


    type	必选项,1表示container,2表示swarm stack,3表示compose stack
    title   必选项
    description		必选项
    image	必选项,该应用使用的docker镜像
    administrator_only	可选项,是否只有管理员可用模板
    name	可选项,该模板在管理界面中显示的名称
    log		可选项,自定义的logo
    registry	可选项,docker镜像的仓库,默认是Dockerhub 
    command		可选项,容器里面运行的命令,如果没有指定,则默认运行dockerfile的command
    network		可选项,模板使用的网络
    volumes		可选项,模板使用的volume
    ports    可选项,模板exposed的端口
    labels    可选项,模板上定义的labels
    privileged    可选项,容器是否能在超级权限启动
    interactive    可选项,容器启动时是否是交互模式,即添加-i -t
    restart_policy    可选项,容器的重启策略
    hostname    可选项,容器的主机名
    note    可选项,关于模板的信息
    platform    可选项,支持的平台,一般是linux或者windows
    categories    可选项,模板的类别,可以在UI上通过category来过滤
    

      

    primary     初级的
    Dashboard     仪表板
    App Templates     应用程序模板
    Stacks    堆栈
    Containers    容器
    Volumes    卷
    Secrets    秘密
    Extensions    扩展
    Endpoints     端点
    Registries     注册处
    

      

    然后在manager-node管理节点上看一下集群节点的状态:

    [root@manager-node ~]# docker node ls
    ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
    1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
    ei53e7o7jf0g36329r3szu4fi    node1         Ready   Active      
    f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active
    

     

    温馨提示:更改节点的availablity状态

    availability状态active、drain,其中:

    active:node可以接受来自manager节点的任务分派;
    drain:ode节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。
    当状态改为drain后,那么该节点就不再接受任务分发,就算之前已经接受的任务也会转移到别的节点上。
     
    [root@manager-node ~]# docker node update --availability drain node1    #将node1节点下线
    [root@manager-node ~]# docker node update --availability active node1  #将下线的节点再次上线
    [root@manager-node ~]# docker node rm --force node1   #删除node1节点
    

      

    Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。

     在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式
    [root@manager-node ~]# docker network create -d overlay ngx_net
    [root@manager-node ~]# docker network ls
    。。。          
    3ye6vfp996i6        ngx_net             overlay             swarm            
    。。。
    

      

    在manager-node节点上使用上面这个覆盖网络创建nginx服务:

    #这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。
    #创建具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
    [root@manager-node ~]# docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx

    使用 docker service ls 查看正在运行的服务的列表

    [root@manager-node ~]# docker service ls
    ID            NAME     REPLICAS  IMAGE            COMMAND
    0jb5eebo8j9q  my-test  1/1       nginx
    

      

    查询Swarm中服务的信息

    --pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:

    [root@manager-node ~]# docker service inspect --pretty my-test
    ID:   0jb5eebo8j9qb1zc795vx3py3
    Name:   my-test
    Mode:   Replicated
     Replicas:  1
    Placement:
    UpdateConfig:
     Parallelism: 1
     On failure:  pause
    ContainerSpec:
     Image:   nginx
    Resources:
    Networks: 3ye6vfp996i6eq17tue0c2jv9
    Ports:
     Protocol = tcp
     TargetPort = 80
     PublishedPort = 80
    

      

    查询到哪个节点正在运行该服务。如下该容器被调度到manager-node节点上启动了,然后访问http://182.48.115.237即可访问这个容器应用(如果调度到其他节点,访问也是如此)
     [root@manager-node ~]# docker service ps my-test
    ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
    2m8qqpoa0dpeua5jbgz1infuy  my-test.1  nginx  manager-node  Running        Running 3 minutes ago
       
    注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。
    有上面命令可知,该服务在manager-node节点上运行。登陆该节点,可以查看到nginx容器在运行中
    [root@manager-node ~]# docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
    1ea1d72007da        nginx:latest   "nginx -g 'daemon off"   4 minutes ago       Up 4 minutes        80/tcp              my-test.1.2m8qqpoa0dpeua5jbgz1infuy
    

      

    -----------------------------------------------------------在Swarm中动态扩展服务(scale)-----------------------------------------------------------

    当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:

    比如将上面的my-test容器动态扩展到5个,命令如下:
    [root@manager-node ~]# docker service scale my-test=5
       
    和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器
    [root@manager-node ~]# docker service ps my-test
    ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
    2m8qqpoa0dpeua5jbgz1infuy  my-test.1  nginx  manager-node  Running        Running 9 minutes ago
    aqko8yhmdj53gmzs8gqhoylc2  my-test.2  nginx  node2         Running        Running 2 minutes ago
    erqk394hd4ay7nfwgaz4zp3s0  my-test.3  nginx  node1         Running        Running 2 minutes ago
    2dslg6w16wzcgboa2hxw1c6k1  my-test.4  nginx  node1         Running        Running 2 minutes ago
    bmyddndlx6xi18hx4yinpakf3  my-test.5  nginx  manager-node  Running        Running 2 minutes ago
       
    可以看到,之前my-test容器只在manager-node节点上有一个实例,而现在又增加了4个实例。
    这5个副本的my-test容器分别运行在这三个节点上,登陆这三个节点,就会发现已经存在运行着的my-test容器。
       
    ----------------------------------------------------------------------------------------
    

      

    -------------
    特别需要清楚的一点:
    如果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。
       
    比如:
    将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来,
    只能等别的节点出现故障后转移task实例到它的上面。使用命令"docker node ls",发现node1节点已不在swarm集群中了。
       
    然后过一会查询服务的状态列表
    [root@manager-node ~]# docker service ps my-test
    ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE           ERROR
    2m8qqpoa0dpeua5jbgz1infuy  my-test.1      docker.io/nginx  manager-node  Running        Running 33 minutes ago
    aqko8yhmdj53gmzs8gqhoylc2  my-test.2      docker.io/nginx  node2         Running        Running 26 minutes ago
    di99oj7l9x6firw1ai25sewwc  my-test.3      docker.io/nginx  node2         Running        Running 6 minutes ago
    erqk394hd4ay7nfwgaz4zp3s0   \_ my-test.3  docker.io/nginx  node1         Shutdown       Complete 5 minutes ago
    aibl3u3pph3fartub0mhwxvzr  my-test.4      docker.io/nginx  node2         Running        Running 6 minutes ago
    2dslg6w16wzcgboa2hxw1c6k1   \_ my-test.4  docker.io/nginx  node1         Shutdown       Complete 5 minutes ago
    bmyddndlx6xi18hx4yinpakf3  my-test.5      docker.io/nginx  manager-node  Running        Running 26 minutes ago
       
    发现,node1节点出现故障后,它上面之前的两个task任务已经转移到node2节点上了。
    登陆到node2节点上,可以看到这两个运行的task任务。当访问182.48.115.239节点的80端口,swarm的负载均衡会把请求路由到一个任意节点的可用的容器上。
    [root@node2 ~]# docker ps
    CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
    216abf6bebea        docker.io/nginx:latest   "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        80/tcp              my-test.3.di99oj7l9x6firw1ai25sewwc
    1afd12cc9140        docker.io/nginx:latest   "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        80/tcp              my-test.4.aibl3u3pph3fartub0mhwxvzr
    cc90da57c25e        docker.io/nginx:latest   "nginx -g 'daemon off"   27 minutes ago      Up 27 minutes       80/tcp              my-test.2.aqko8yhmdj53gmzs8gqhoylc2
       
    再次在node2节点上将从node1上转移过来的两个task关闭
    [root@node2 ~]# docker stop my-test.3.di99oj7l9x6firw1ai25sewwc my-test.4.aibl3u3pph3fartub0mhwxvzr
    my-test.3.di99oj7l9x6firw1ai25sewwc
    my-test.4.aibl3u3pph3fartub0mhwxvzr
       
    再次查询服务的状态列表,发现这两个task又转移到node1上了(即在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上)
    [root@manager-node ~]# docker service ps my-test
    ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE                ERROR
    2m8qqpoa0dpeua5jbgz1infuy  my-test.1      docker.io/nginx  manager-node  Running        Running 38 minutes ago    
    aqko8yhmdj53gmzs8gqhoylc2  my-test.2      docker.io/nginx  node2         Running        Running 31 minutes ago    
    7dhmc63rk0bc8ngt59ix38l44  my-test.3      docker.io/nginx  node1         Running        Running about a minute ago
    di99oj7l9x6firw1ai25sewwc   \_ my-test.3  docker.io/nginx  node2         Shutdown       Complete about a minute ago
    erqk394hd4ay7nfwgaz4zp3s0   \_ my-test.3  docker.io/nginx  node1         Shutdown       Complete 9 minutes ago    
    607tyjv6foc0ztjjvdo3l3lge  my-test.4      docker.io/nginx  node1         Running        Running about a minute ago
    aibl3u3pph3fartub0mhwxvzr   \_ my-test.4  docker.io/nginx  node2         Shutdown       Complete about a minute ago
    2dslg6w16wzcgboa2hxw1c6k1   \_ my-test.4  docker.io/nginx  node1         Shutdown       Complete 9 minutes ago    
    bmyddndlx6xi18hx4yinpakf3  my-test.5      docker.io/nginx  manager-node  Running        Running 31 minutes ago
      
    ----------------------------------------------------------------------------------------------------
    同理,swarm还可以缩容,如下,将my-test容器变为1个。
    [root@manager-node ~]# docker service scale my-test=1
    [root@manager-node ~]# docker service ps my-test
    ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
    2m8qqpoa0dpeuasdfsdfdfsdf  my-test.1  nginx  manager-node  Running        Running 3 minutes ago
      
    登录node2节点,使用docker ps查看,会发现容器被stop而非rm
      
    ---------------------------------------------------------------------------------------------------
    删除容器服务
    [root@manager-node ~]# docker service --help       //查看帮助
    [root@manager-node ~]# docker service rm my-test    //这样就会把所有节点上的所有容器(task任务实例)全部删除了
    my-nginx
       
    ---------------------------------------------------------------------------------------------------
    除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。
    [root@manager-node ~]# docker service update --replicas 3 my-test
    my-test
      
    更新完毕以后,可以查看到REPLICAS已经变成3/3
    [root@manager-node ~]# docker service ls
    ID            NAME          REPLICAS  IMAGE      COMMAND 
    d7cygmer0yy5  my-test       3/3       nginx     /bin/bash
      
    [root@manager-node ~]# docker service ps my-test
    ID                         NAME             IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
    ddkidkz0jgor751ffst55kvx4  my-test.1      nginx  node1         Running          Preparing 4 seconds ago
    1aucul1b3qwlmu6ocu312nyst   \_ my-test.1  nginx  manager-node  Shutdown       Complete 5 seconds ago 
    4w9xof53f0falej9nqgq064jz   \_ my-test.1  nginx  manager-node  Shutdown       Complete 19 seconds ago
    0e9szyfbimaow9tffxfeymci2   \_ my-test.1  nginx  manager-node  Shutdown       Complete 30 seconds ago
    27aqnlclp0capnp1us1wuiaxm  my-test.2      nginx  manager-node  Running        Preparing 1 seconds ago
    7dmmmle29uuiz8ey3tq06ebb8  my-test.3      nginx  manager-node  Running        Preparing 1 seconds ago
      
    docker service update 命令,也可用于直接 升级 镜像等。
    [root@manager-node ~]# docker service update --image nginx:new my-test
      
    [root@manager-node ~]# docker service ls
    ID            NAME          REPLICAS  IMAGE         COMMAND 
    d7cygmer0yy5  my-test       3/3       nginx:new     /bin/bash
    

      

     
  • 相关阅读:
    vue+ajax+bootstrap+python实现增删改
    django笔记
    阻止冒泡事件的另一种写法
    c# 字符串的内存分配和驻留池( 转 )
    c# 几种深拷贝方式的比较
    JS 常用函数
    Web Api 过滤器之 AuthorizationFilter 验证过滤器
    c# await 到底等待的是什么?
    ( 转 ) CORS 有一次 OPTIONS 请求的原理
    Web Api 过滤器之 ExceptionFilter 异常过滤器
  • 原文地址:https://www.cnblogs.com/linuxws/p/10778389.html
Copyright © 2020-2023  润新知