zoukankan      html  css  js  c++  java
  • swarm集群日常部分操作

    docker swarm:

    1)查看集群
    使用docker info 或 docker node ls 查看集群中的相关信息

    2)swarm集群中node的availability状态可以为 active或者drain,其中:
    active状态下,node可以接受来自manager节点的任务分派;
    drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。
    #docker node update --availability drain node1 //将node1节点下线。如果要删除node1节点,命令是"docker node rm --force node1

    注意:当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。

    再次修改为active状态(及将下线的节点再次上线)
    #docker node update --availability active node1

    3)在Swarm中部署服务(这里以nginx服务为例)
    Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。

    #docker network create -d overlay ngx_net //在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式

    #docker network ls //查看

    在manager-node节点上使用上面这个覆盖网络创建nginx服务: 其中,--replicas 参数指定服务由几个实例组成。
    注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像
    #docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx

    查看:
    # docker service ls
    ID NAME REPLICAS IMAGE COMMAND
    0jb5eebo8j9q my-test 1/1 nginx

    查询Swarm中服务的信息
    # 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

    4)----------在Swarm中动态扩展服务(scale)------
    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集群中了。


    同理,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

    docker service update 命令,也可用于直接 升级 镜像等。
    [root@manager-node ~]# docker service update --image nginx:new my-test

    5)Swarm中使用Volume(挂载目录,mount)
    查看docker volume的帮助信息
    [root@manager-node ~]# docker volume --help

    [root@manager-node ~]# docker volume create --name myvolume
    myvolume

    [root@manager-node ~]# docker volume ls
    DRIVER VOLUME NAME
    local 11b68dce3fff0d57172e18bc4e4cfc252b984354485d747bf24abc9b11688171
    local 1cd106ed7416f52d6c77ed19ee7e954df4fa810493bb7e6cf01775da8f9c475f
    local myvolume

    参数src写成source也可以;dst表示容器内的路径,也可以写成target
    [root@manager-node ~]# docker service create --replicas 2 --mount type=volume,src=myvolume,dst=/peng --name test-nginx nginx

    [root@manager-node ~]# docker service ls
    ID NAME REPLICAS IMAGE COMMAND
    8s9m0okwlhvl test-nginx 2/2 nginx

    [root@manager-node ~]# docker service ps test-nginx
    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
    32bqjjhqcl1k5z74ijjli35z3 test-nginx.1 nginx node1 Running Running 23 seconds ago
    48xoypunb3g401jkn690lx7xt test-nginx.2 nginx node2 Running Running 23 seconds ago

    登录node1节点的test-nginx容器查看
    [root@node1 ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    d471569629b2 nginx:latest "nginx -g 'daemon off" 2 minutes ago Up 2 minutes 80/tcp test-nginx.1.32bqjjhqcl1k5z74ijjli35z3

    [root@node1 ~]# docker exec -ti d471569629b2 /bin/bash
    root@d471569629b2:/# cd /peng/
    root@d471569629b2:/peng# ls
    root@d471569629b2:/peng# echo "ahahha" > test
    root@d471569629b2:/peng# ls
    test

    [root@node1 ~]# docker volume inspect myvolume
    [
    {
    "Name": "myvolume",
    "Driver": "local",
    "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
    "Labels": null,
    "Scope": "local"
    }
    ]

    [root@node1 ~]# cd /var/lib/docker/volumes/myvolume/_data/
    [root@node1 _data]# ls
    test
    [root@node1 _data]# cat test
    ahahha
    [root@node1 _data]# echo "12313" > 123
    [root@node1 _data]# ls
    123 test

    root@d471569629b2:/peng# ls
    123 test
    root@d471569629b2:/peng# cat test
    ahahha

    还可以将node1节点机上的volume数据目录做成软链接
    [root@node1 ~]# ln -s /var/lib/docker/volumes/myvolume/_data /peng
    [root@node1 ~]# cd /peng
    [root@node1 peng]# ls
    123 test
    [root@node1 peng]# rm -f test
    [root@node1 peng]# echo "5555" > haha

    root@d471569629b2:/peng# ls
    123 haha
    root@d471569629b2:/peng# cat haha
    5555

    第二种方法:
    命令格式: docker service create --mount type=bind,target=/container_data/,source=/host_data/
    其中,参数target表示容器里面的路径,source表示本地硬盘路径。

    [root@manager-node ~]# docker service create --replicas 1 --mount type=bind,target=/usr/share/nginx/html/,source=/opt/web/ --network ngx_net --name haha-nginx -p 8880:80 nginx

    [root@manager-node ~]# docker service ls
    ID NAME REPLICAS IMAGE COMMAND
    9t9d58b5bq4u haha-nginx 1/1 nginx

    [root@manager-node ~]# docker service ps haha-nginx
    ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
    bji4f5tikhvm7nf5ief3jk2is haha-nginx.1 nginx node2 Running Running 18 seconds ago

    登录node2节点,在挂载目录/opt/web下写测试数据
    [root@node2 _data]# cd /opt/web/
    [root@node2 web]# ls
    [root@node2 web]# cat peng.html
    sdfasdf

    登录容器查看,发现已经实现数据同步
    [root@node2 ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3618e3d1b966 nginx:latest "nginx -g 'daemon off" 28 seconds ago Up 24 seconds 80/tcp haha-nginx.1.bji4f5tikhvm7nf5ief3jk2is

    [root@node2 ~]# docker exec -ti 3618e3d1b966 /bin/bash
    root@3618e3d1b966:/# cd /usr/share/nginx/html
    root@3618e3d1b966:/usr/share/nginx/html# ls
    peng.html
    root@3618e3d1b966:/usr/share/nginx/html# cat peng.html
    sdfasdf
    root@3618e3d1b966:/usr/share/nginx/html# touch test
    touch: cannot touch 'test': Permission denied

    由此可见,以上设置后,在容器里的同步目录下没有写权限,更新内容时只要放到宿主机的挂载目录下即可!

  • 相关阅读:
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(2)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(9)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(10)
    CKEditor在asp.net环境下的使用一例
    《Microsoft Sql server 2008 Internals》读书笔记第五章Table(7)
    《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(11)
    千万数据的连续ID表,快速读取其中指定的某1000条数据?
    javascript中的float运算精度
    .Net与Java的互操作(.NET StockTrader微软官方示例应用程序)
    《Microsoft Sql server 2008 Internals》读书笔记第十一章DBCC Internals(6)
  • 原文地址:https://www.cnblogs.com/pengai/p/9441029.html
Copyright © 2011-2022 走看看