Docker Swarm

作者: 青衣敖王侯 | 来源:发表于2019-12-01 13:02 被阅读0次
    image.png

    swarm是一个集群架构

    Swarm有两种节点,一种叫Manager,一种叫Worker。Manager是指挥官,多个Manager之间会做同步,Worker是真正干活的,Worker之间也要数据同步。



    replicas可以理解为容器。

    1.创建一个三节点的swarm集群

    进入https://labs.play-with-docker.com/p/bngt93vad2eg009qp6h0#bngt93va_bngt9kfad2eg009qp6l0
    这个网站去搭建


    执行以下命令:
    $ docker swarm init --advertise-addr 192.168.0.16
    Swarm initialized: current node (hwip18th1x341ya0mgfhy0odn) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-47yjbgi9agonlqcx561xj83m0yghgtsfvrrqutzpdnfv4cc0c4-5yzowa1j2s2hwubzl8amgsvcq 192.168.0.16:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    我们可以从结果中看到启动的是一个manager。

    [root@master ~]# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    rvr00w2iu56y94ru5l1gmcg03 *   master              Ready               Active              Leader              19.03.5
    

    在第二台机器上执行命令,加入到manager集群中



    回到第一台机器,我么可以看到节点加入进来了



    加入第三台机器

    2.service的创建维护和水平扩展

    service就是一个容器,swarm可以使用docker service创建一个容器。类似于docker run,但是docker是在本地创建一个容器。docker service就不仅仅是在本地创建容器了。
    创建一个busybox:



    我们通过下面的截图可以看到这个service运行在node2节点上:



    通过docker ps可以发现node3上根本没有busybox,只有我自己启动的一个nginx。证明了service启动的时候是随机选择了集群中的一个节点进行启动。

    接下来我们对我们的demo3进行水平扩展

    重点关注下REPLICAS从1/1变成了5/5,说明我们扩展成功了,分母上的5表示设置的scale的数量,分子上表示运行中的。在通过docker service ps demo3看看有多少个运行的,且分别运行在什么机器上:



    如果说我们在node2上去docker rm -f一个container会发生什么事情呢?


    我们发现RELICAS从4/5变成了5/5,为什么会这样?
    执行docker service ps demo3可以发现,挂掉了一个之后,又重新启动了一个起来。

    那如果我们真正的要做删除操作呢?docker service rm service名称即可

    在swarm中Container和Container之间的访问通过overlay网络。我们启动多个service,如果service有绑定端口,则此服务可以通过任意swarm节点的相应端口访问。当一个container去访问swarm中的另外一个container的时候,首先通过DNS把服务名解析成一个VIP,然后这个VIP在映射到具体的Service中。如下图所示:


    docker容器之间的通信是通过overlay来进行的:


    2.用Docker swarm部署一个复杂的应用

    2.1编辑一个docker-compose.yml

    version: "3"
    services:
    
      redis:
        image: redis:alpine
        ports:
          - "6379"
        networks:
          - frontend
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      db:
        image: postgres:9.4
        volumes:
          - db-data:/var/lib/postgresql/data
        networks:
          - backend
        deploy:
          placement:
            constraints: [node.role == manager]
    
      vote:
        image: dockersamples/examplevotingapp_vote:before
        ports:
          - 5000:80
        networks:
          - frontend
        depends_on:
          - redis
        deploy:
          replicas: 2
          update_config:
            parallelism: 2
          restart_policy:
            condition: on-failure
    
      result:
        image: dockersamples/examplevotingapp_result:before
        ports:
          - 5001:80
        networks:
          - backend
        depends_on:
          - db
        deploy:
          replicas: 1
          update_config:
            parallelism: 2
            delay: 10s
          restart_policy:
            condition: on-failure
    
      worker:
        image: dockersamples/examplevotingapp_worker
        networks:
          - frontend
          - backend
        deploy:
          mode: replicated
          replicas: 1
          labels: [APP=VOTING]
          restart_policy:
            condition: on-failure
            delay: 10s
            max_attempts: 3
            window: 120s
          placement:
            constraints: [node.role == manager]
    
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        stop_grace_period: 1m30s
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
    
    networks:
      frontend:
      backend:
    
    volumes:
      db-data:
    

    这个compose文件中有多个应用,我们对这个文件中所有的应用进行部署:

    $ docker stack deploy zzm --compose-file=docker-compose.yml
    Creating network zzm_frontend
    Creating network zzm_default
    Creating network zzm_backend
    Creating service zzm_worker
    Creating service zzm_visualizer
    Creating service zzm_redis
    Creating service zzm_db
    Creating service zzm_vote
    Creating service zzm_result
    

    查看这里面有多少services



    查看一下swarm集群中的service情况分布



    现在我们打算把zzm_vote这个service从2个扩展到3个:

    3.Docker secret管理和使用


    3.1通过文件创建一个密码,然后删掉文件

    3.2查看我们创建的密码

    3.3创建一个service使用这个密码


    相关文章

      网友评论

        本文标题:Docker Swarm

        本文链接:https://www.haomeiwen.com/subject/nqtowctx.html