zoukankan      html  css  js  c++  java
  • 8天入门docker系列 —— 第八天 让程序跑在swarm集群上

      真正的落地部署都是希望程序跑在集群下,而不是单机版下测测玩玩,所以这篇就来聊一下怎么使用docker swarm进行部署,因为是swarm是docker自带的,

    所以部署起来还是非常简单的。

    一:前置条件

      准备三台centos机器: 

          192.168.23.154   manager
          192.168.23.155   work1
          192.168.23.156    work2

    二:构建集群

    1.  manger节点上使用 docker swarm init 即可创建只有一个master节点的集群。

    [root@manager ~]# docker swarm init
    Swarm initialized: current node (h303fwvspazsv74h6jcj0urz3) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

    2. 将上面红色字体copy到work1和work2 这两个node节点即可,这样就可以构建3个节点的swarm集群。

    《1》 work1

    [root@work1 ~]#  docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377
    This node joined a swarm as a worker.

    《2》 work2

    [root@work2 ~]#  docker swarm join --token SWMTKN-1-0wakl67xyg5ia13yhvd7rvs7anvh6yn2t9tqcu8wxhpel26gjc-9bror7wo9dh2e7nswwtpjyd0u 192.168.23.154:2377
    This node joined a swarm as a worker.

           最后到manager节点查看一下三台机器的分布情况。

    [root@manager ~]# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    h303fwvspazsv74h6jcj0urz3 *   manager             Ready               Active              Leader              18.09.6
    zaud8bjpttqno3swqjilfzbo3     work1               Ready               Active                                  18.09.6
    ihxnypgl1wamfv583xonl483f     work2               Ready               Active                                  18.09.6

     三:程序部署

            程序还是采用上节课说到的python+redis,现在有了三个节点,我希望web程序可以有5个镜像,redis因为是db服务,所以尽量安排在某一个节点寄存,这是因为

    如果redis做成了多个,db文件没不好同步处理了,当然你可以采用类似的clusterfs来实现多机器间的db同步,这里就不麻烦了,接下来我来画一张部署图。

    这里要注意的一点就是,集群中的manager节点不仅可以作为调度节点,同时也可以兼职work节点的功能,直白一点就是可以在manager上跑容器。

    1. pythonweb 推送到远程

        前面博文中我只在本地做了一个build,其实在swarm部署中是建议全部做成镜像,然后推送到自己的docker registry中,这样各个work节点只需要从远程拉取

    镜像即可,不需要带着一些源码文件到处跑。

    [root@manager data]# docker build -t webapp .
    Sending build context to Docker daemon  6.144kB
    Step 1/6 : FROM python:2.7-slim
    2.7-slim: Pulling from library/python
    f5d23c7fed46: Pull complete 
    cdc362a1b8d3: Pull complete 
    d43d1ec67d25: Pull complete 
    0269ba15cf1b: Pull complete 
    Digest: sha256:4149310fdae239c7b09aa5fa04263e86b89d11da9bfb1116b4f74782358bfea8
    [root@manager data]# docker tag webapp:latest huangxincheng520/webapp:latest
    [root@manager data]# docker push huangxincheng520/webapp:latest
    The push refers to repository [docker.io/huangxincheng520/webapp]
    48e326095e39: Layer already exists 
    2be3ac14ba61: Pushed 
    fb23e9b75b52: Layer already exists 
    c04915bf1261: Layer already exists 
    32d47307f796: Layer already exists 
    c86aa07d5fdb: Pushed 
    d8a33133e477: Pushed 
    latest: digest: sha256:2c79581255988e78efa97ec9b5c43d742ce8b9535b00660f8e7061f2a0d1d30d size: 1788

    2. docker-compose

    version: "3"
    services:
      web:
        image: huangxincheng520/webapp
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
        ports:
          - "80:80"
        networks:
          - webnet
      redis:
        image: redis
        ports:
          - "6379:6379"
        volumes:
          - "myvol:/data"
        deploy:
          placement:
            constraints: [node.hostname == work2]
        command: redis-server --appendonly yes
        networks:
          - webnet
    networks:
      webnet:
    volumes:
      myvol:

        如果大家了解单机版docker-compose的写法,那分布式版也就不难,主要在于deploy节点的使用。

    《1》  replicas: 5     从这个可以看到,当前我希望web部署成5份,到底怎么分配由swarm集群自己决定,我只需要知道结果就可以了。

    《2》 constraints: [node.hostname == work2]      可以看到,我已经要求swarm将redis部署在hostname=work2的节点上。

    3.   docker stack deploy

            都准备好了,接下来就可以跑一下。

    [root@manager data]# docker stack deploy -c ./docker-compose.yml web
    Creating network web_webnet
    Creating service web_web
    Creating service web_redis

          然后通过 docker stack ps web 看一下stack 的各服务下的所有container的部署情况。

    [root@manager data]# docker stack ps web
    ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE            ERROR                              PORTS
    qym36md95ni6        web_redis.1         redis:latest                     work2               Running             Running 33 seconds ago                                      
    c0zmb5j9zx6q        web_web.1           huangxincheng520/webapp:latest   manager             Running             Running 3 minutes ago                                       
    lczqz66skupc        web_web.2           huangxincheng520/webapp:latest   work2               Running             Running 3 minutes ago                                       
    ota9lz0aws21        web_web.3           huangxincheng520/webapp:latest   work1               Running             Running 3 minutes ago                                       
    2snnttrgoq43        web_web.4           huangxincheng520/webapp:latest   manager             Running             Running 3 minutes ago                                       
    5735udmor57z        web_web.5           huangxincheng520/webapp:latest   work1               Running             Running 3 minutes ago 

       

        通过命令可以看到,web确实是5个,manager上有两个,work1上有两个,work2上有一个,同时redis也是部署在work2上的,接下来我们随便通过一个ip地址

    访问一下web是否可以访问的通。

      

           现在这个横向扩容能力就非常强大了,只要机器足够,你都可以扩展到100个web,对吧,好了,本系列就说到这里,希望对你学习docker有帮助。

  • 相关阅读:
    哇塞 今天是数论专场呢 我要爆炸了
    树状数组模板题 hdu 1166
    [思维]Radar Scanner
    [思维]Minimum Spanning Tree
    [容斥]数对
    [概率]Lucky Coins
    [数学]特征方程求线性递推方程的通项公式
    [树状数组][2019徐州网络赛I]query
    [计算几何]Piece of Cake
    [欧拉降幂][2019南京网络赛B]super_log
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/11295062.html
Copyright © 2011-2022 走看看