docker stacks 堆栈

介绍

docker 集群中,学习了如何设置docker集群,这是一组运行docker的机器,并将运用程序部署到其上,容器在多台机器上协同运行。

在本篇文档中,将学习分布式应用程序堆栈。堆栈是一组相互关联的服务,它们共享依赖关系,并且可以一起编排和缩放。单个堆栈能够定义和协调整个应用程序的功能(非常复杂的应用程序可能希望使用多个堆栈)。当您创建一个Compose文件并使用时,您在技术上一直在使用堆栈docker stack deploy。但是,这是单个主机上运行的单一服务堆栈,这通常不会在生产中发生。在这里,您将获取所学知识,使多个服务相互关联,并在多台计算机上运行。

添加新服务并重新部署

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

  1. docker-compose.yml在编辑器中打开并用以下内容替换其内容。一定要更换username/repo:tag你的镜像。
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: username/repo:tag
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
        ports:
          - "80: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:
    

    这里唯一新来的是对等服务web,命名visualizer。您将在这里看到两个新的东西:一个volumes关键字,让可视化程序访问Docker的主机套接字文件以及一个placement关键字,确保这个服务只能在群集管理器上运行,而不是工作人员。这是因为由Docker创建的开源项目构建的这个容器显示了在图中以群集运行的Docker服务。

    稍后我们会详细讨论放置约束和卷。

  2. 将此新docker-compose.yml文件复制到群组管理器myvm1
    docker-machine scp docker-compose.yml myvm1:~
    
  3. docker stack deploy在管理员上重新运行命令,任何需要更新的服务将被更新:
    $ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
    Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
    Updating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
    
  4. 看看可视化器。您在Compose文件中看到在visualizer8080端口上运行docker-machine ls。通过运行获取您的一个节点的IP地址。转到8080端口的IP地址,您将看到可视化运行:

单个副本visualizer正如您所期望的那样在主服务器上运行,并且五个实例web分布在群集中。您可以通过运行docker stack ps <stack>以下方式来证实这种可视化:

docker-machine ssh myvm1 "docker stack ps getstartedlab"

可视化器是一种独立的服务,可以在任何包含在堆栈中的应用程序中运行。它不依赖于其他任何东西。现在让我们创建一个确实具有依赖性的服务:Redis服务将提供一个访客计数器。

通过8080无法访问请进入虚拟机查看netstat -anp | grep 8080 如果没有

执行docker images 查看是否有dockersamples/visualizer:stable 镜像

如果没有可能是网络下载过慢造成的,建议更换docker源为国内的,更换方法前边以有介绍

保存数据

让我们再次浏览相同的工作流程,以添加用于存储应用数据的Redis数据库。

  1. 保存这个新docker-compose.yml文件,最后添加一个Redis服务。一定要更换username/repo:tag你的镜像。
    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: username/repo:tag
        deploy:
          replicas: 5
          restart_policy:
            condition: on-failure
          resources:
            limits:
              cpus: "0.1"
              memory: 50M
        ports:
          - "80: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:
          - ./data:/data
        deploy:
          placement:
            constraints: [node.role == manager]
        networks:
          - webnet
    networks:
      webnet:
    

    Redis在Docker hub 有一个官方镜像,并被授予了简短的image名字redis,所以username/repo在这里没有符号。Redis端口6379已由Redis预配置为从容器暴露给主机,在我们的Compose文件中,我们将其从主机公开,因此您可以真正输入您的任何IP节点进入Redis Desktop Manager并管理此Redis实例,如果您这样选择。

    最重要的是,redis规范中有几件事情使数据在该堆栈的部署之间保持不变:

    • redis 总是在管理器上运行,所以它总是使用相同的文件系统。
    • redis访问主机文件系统中的任意目录在/data容器内,Redis存储数据。

    在一起,这是在您的主机的物理文件系统中为Redis数据创建“真实目录”。没有这个,Redis会将其数据存储 /data在容器的文件系统内,如果该容器被重新部署,它将被清除。

    来源有两个部分:

    • 您放置在Redis服务上的放置约束,确保它始终使用相同的主机。
    • 您创建的卷允许容器访问./data(在主机上)为/data(在Redis容器内)。当容器来回走动时,存储在./data指定主机上的文件将持续存在,从而实现连续性。

    您已准备好部署新的Redis使用堆栈。

  2. ./data在管理器上创建一个目录:
    $ docker-machine ssh myvm1 "mkdir ./data"
    
  3. 通过以下方式复制新docker-compose.yml文件docker-machine scp
    $ docker-machine scp docker-compose.yml myvm1:~
    
  4. 再运行docker stack deploy一次
    $ docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
    
  5. 检查您的一个节点(例如http://192.168.99.101)的网页,您将看到访客计数器的结果,该计数器现在已存在,并存储有关Redis的信息。

    另外,检查可视化在上的任一节点的IP地址端口8080,你会看到redis与一起运行服务webvisualizer服务。

发表评论

电子邮件地址不会被公开。 必填项已用*标注