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有帮助。

  • 相关阅读:
    warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]
    Windows10+CLion+OpenCV4.5.2开发环境搭建
    Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
    MediaCodec.configure Picture Width(1080) or Height(2163) invalid, should N*2
    tesseract
    Caer -- a friendly API wrapper for OpenCV
    Integrating OpenCV python tool into one SKlearn MNIST example for supporting prediction
    Integrating Hub with one sklearn mnist example
    What is WSGI (Web Server Gateway Interface)?
    Hub --- 机器学习燃料(数据)的仓库
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/11295062.html
Copyright © 2011-2022 走看看