• Docker Get Started V


    5. Stacks

    介绍

    在第4部分,你已经学会如何配置一个蜂群,蜂群是一个运行着docker的集群,然后你将app部署到这个蜂群上,容器运行在多个机器上。

    在第5部分,我们马上介绍分布式应用层级的最上层的概念stack。一个stack是一组共享依赖的内部相关的服务,这些服务能够被一起编排和伸缩。单独的一个stack能够定义和协调整个应用的功能,一些复杂的应用可能需要定义多个stack。

    不要慌,从第3部分开始,我们就已经接触到了stack,前面我们创建compose文件,然后运行docker stack deploy,这些都是和stack相关的内容。但是前面我们接触的都是运行在单台机器上的包含单个服务的stack,这个在生产环境中不常见。接下来,运用之前学到的知识,我们来创建多个相关的服务,然后运行在多台机器上。

    增加一个Service 重新部署

    修改docker-compose.yml文件很容易添加一个服务。首先我们增加一个免费的可视化服务,这个服务可以让我们看我们的蜂群是如何调度我们的容器的。

    1. 打开docker-compose.yml文件,修改为如下内容:
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: dockerjie/get-started:part2
        deploy:
          replicas: 5
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
          restart_policy:
            condition: on-failure
        ports:
          - "4000:80"
        networks:
          - webnet
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet  
    networks:
      webnet:
    

    注意上面有两个新的配置项,volumes,运行可视化服务访问宿主机的Docker的socket文件,placement则确保服务被部署在蜂群管理器swarm manager上面,而不是worker上,因为可视化服务是显示蜂群概览信息的,仅仅管理器才有权限获取到这些信息。

    1. 确保你的shell连接到myvm1机器上。docker-machine start $(docker-machine ls -q)启动所有机器
      1. 运行docker-machine ls确保你连接到myvm1上。如果出现ip地址对应的cert不对应,则重新运行命令生成cert,docker-machine regenerate-certs $(docker-machine ls -q)

    image.png | left | 625x59

    2. 如有必要运行 eval $(docker-machine env myvm1)
    

    image.png | left | 625x72

    1. 在蜂窝管理器上重新运行 docker stack deploy
    docker stack deploy -c docker-compose-yml getstartedlab
    

    部署完成后查看服务:

    image.png | left | 681x47

    访问可视化服务:

    image.png | left | 681x666

    可以看到两个服务:visualizer和web均已经启动,且web服务的副本数量为5,分布为:

    • myvm1*1
    • myvm2*2
    • myvm3*2

    也可以使用docker命令查看:

    docker stack ps getstartedlab
    

    image.png | left | 681x75

    持久化数据

    到现在为止,我们的web服务中依赖的redis服务还没有配置。

    1. 修改docker-compose文件,增加redis服务
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: dockerjie/get-started:part2
        deploy:
          replicas: 5
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
          restart_policy:
            condition: on-failure
        ports:
          - "4000:80"
        networks:
          - webnet
      visualizer:
        image: dockersamples/visualizer:stable
        ports:
          - "8080:8080"
        volumes:
          - "/var/run/docker.sock:/var/run/docker.sock"
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet  
      redis:
        image: redis
        ports:
          - "6379:6379"
        volumes:
          - "/home/docker/data:/data"
        deploy:
          placement:
            constraints: [node.role == manager]
        command: redis-server --appendonly yes
        networks:
          - webnet
    networks:
      webnet:
    
    

    redis有官方的镜像,因此具有一个short name redis。6379是redis容器预先配置的端口,需要对外暴露的,我们也暴露这个端口给宿主机。有两个额外的配置只得注意:

    • redis一直运行在manager上,因此它一直运行在相同的文件系统上,因为是同一个宿主机。
    • redis访问宿主机上的文件夹作为/data目录,redis将数据存储到这里。

    redis需要持久化数据到容器里的/data目录,而容器启动, 停止后,里面的数据都没有了。因此为了持久化数据,需要将容器的某些目录映射到宿主机上,这样数据才会被真正的持久化。

    1. 在manager宿主机上创建data目录
    docker-machine ssh myvm1 "mkdir ./data"
    
    1. 部署
    docker stack deploy -c docker-compose.yml getstartedlab
    

    image.png | left | 681x61

    查看浏览器验证:

    image.png | left | 747x698

    查看持久化生效:

    image.png | left | 681x214

  • 相关阅读:
    汉字乱码、加密后结果字符串不一致
    msgpack和TParams互相转换
    unigui监听会话开始和结束
    System.JSON.Builders.pas
    保证最终一致性的模式
    使用 Delta Sharing 协议进行数据共享
    dremio 16 升级问题
    graylog 4.0 运行
    supabase 开源firebase 可选工具
    cube.js 最新playground 说明
  • 原文地址:https://www.cnblogs.com/Spground/p/9791247.html
Copyright © 2020-2023  润新知