• docker从零开始(五)堆栈初体验,stacks


    先决条件

    • 安装Docker 1.13或更高版本
    • 获取Docker Compose,请参考第三节
    • 按照第四节中的描述获取Docker Machine
    • 在第二节中了解如何创建容器

    • 确保您的图像作为已部署的容器运行。运行此命令,在您的信息槽中  usernamerepotagdocker run -p 80:80 username/repo:tag,然后访问http://localhost/

    • docker-compose.yml第3部分获得一份方便的副本

    • 确保您在第四节中设置的计算机正在运行并准备就绪。运行docker-machine ls以验证这一点。如果计算机已停止,请运行docker-machine start myvm1以引导管理器,然后docker-machine start myvm2再引导该工作程序。

    • 让你在第四节中创建的swarm 运行并准备就绪。运行 docker-machine ssh myvm1 "docker node ls"以验证这一点。如果群集已启动,则两个节点都会报告ready状态。如果不是,重新初始化群和描述中加入worker

    介绍

    在第四节中,您学习了如何设置一个群集,这是一个运行Docker的计算机集群,并为其部署了一个应用程序,其中容器在多台计算机上协同运行。

    在第5部分中,您将到达分布式应用程序层次结构的顶部:堆栈堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起。单个堆栈能够定义和协调整个应用程序的功能(尽管非常复杂的应用程序可能希望使用多个堆栈)。

    一些好消息是,从第3部分开始,当您创建Compose文件并使用时,您在技术上一直在使用堆栈docker stack deploy但这是在单个主机上运行的单个服务堆栈,这通常不会在生产中发生。在这里,您可以学习所学内容,使多个服务相互关联,并在多台计算机上运行它们。

    添加新服务并重新部署

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

    1. docker-compose.yml在编辑器中打开并用以下内容替换其内容。请务必更换username/repo:tag镜像详细信息。

    version: "3"
    services:
      web:
        # replace username/repo:tag with your name and image details
        image: benjamin77/image:part2
        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密钥,确保这个服务只能在一个swarm管理器上运行 - 绝不是一个工人。

    这是因为这个容器是由Docker创建的开源项目构建,它显示了在图中的swarm上运行的Docker服务。

    2.确保您的shell配置为与之通信myvm1

    [root@docker11 docker_install]# docker-machine ls
    NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
    myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.06.0-ce   
    myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.06.0-ce   
    [root@docker11 docker_install]# docker-machine env myvm1
    export DOCKER_TLS_VERIFY="1"
    export DOCKER_HOST="tcp://192.168.99.100:2376"
    export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
    export DOCKER_MACHINE_NAME="myvm1"
    # Run this command to configure your shell: 
    # eval $(docker-machine env myvm1)
    [root@docker11 docker_install]# eval $(docker-machine env myvm1)
    [root@docker11 docker_install [myvm1]]# 

    3.docker stack deploy在管理器上重新运行该命令,并更新需要更新的任何服务:

    [root@docker11 docker_install]# eval $(docker-machine env myvm1)
    [root@docker11 docker_install [myvm1]]# docker stack deploy -c docker-compose.yml getstartedlab
    Creating service getstartedlab_visualizer
    Updating service getstartedlab_web (id: 3gnwxgnc10ie0jgmvq19ws5tb)
    [root@docker11 docker_install [myvm1]]# 

    4.看一下可视化工具。

    您在Compose文件中看到了visualizer在端口8080上运行docker-machine ls通过运行获取其中一个节点的IP地址转到端口8080的IP地址,您可以看到运行的可视化工具:

    visualizer正如您所期望的那样,单个副本正在管理器上运行,并且5个实例web分布在整个群集中。您可以通过运行docker stack ps <stack>以下来证实此可视化

    docker stack ps getstartedlab

    持久化数据

    让我们再次通过相同的工作流程来添加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:
          - "/home/docker/data:/data"
        deploy:
          placement:
            constraints: [node.role == manager]
        command: redis-server --appendonly yes
        networks:
          - webnet
    networks:
      webnet:

    Redis在Docker库中有一个官方图像,并且已被授予imagejust 的简称redis,所以username/repo这里没有注释。Redis端口6379已由Redis预先配置为从容器暴露给主机,在我们的Compose文件中,我们将它从主机暴露给全世界,因此您实际上可以输入任何IP的IP如果您愿意,可以将节点导入Redis Desktop Manager并管理此Redis实例。

    最重要的是,redis规范中有一些事项会使数据在此堆栈的部署之间保持不变:

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

    总之,这是在主机的物理文件系统中为Redis数据创建“真实来源”。如果没有这个,Redis会将其数据存储 /data在容器的文件系统中,如果重新部署该容器,将会被删除。

    这个真相来源有两个组成部分:

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

    您已准备好部署新的Redis-using堆栈。

    在管理器上创建一个目录./data:

    docker-machine ssh myvm1 "mkdir ./data"

    确保您的shell配置为与之通信myvm1

    • 运行docker-machine ls以列出计算机并确保已连接到myvm1,如下一个星号所示。

    • 如果需要,请重新运行docker-machine env myvm1,然后运行给定的命令来配置shell。

      eval $(docker-machine env myvm1)

      4.再跑docker stack deploy一次。

      [root@docker11 docker_install [myvm1]]#  docker stack deploy -c docker-compose.yml getstartedlab

      5.运行docker service ls以验证三个服务是否按预期运行。

       6.检查一个节点上的网页,例如http://192.168.99.100,并查看访问者计数器的结果,该计数器现已存在并在Redis上存储信息。

       每刷新一次网页 Visits 值会加 1

       同时,检查在上的任一节点的IP地址,端口8080的可视化工具,并注意看redis与一起运行服务webvisualizer服务

       





  • 相关阅读:
    python自定义编写有关用户登录注册程序代码
    项目经理多年的经验之谈
    Linux虚拟机克隆后,启动系统发现网卡无法启动
    mysql出现服务器异常后,重启服务器后无法开启数据库处理方法
    计算机毕业四年,我都做了什么?
    个人Blog(采用Django+uwsgi+nginx)里面包含很多技术文章
    Delphi to C# Equivalancesdelphi和C#类似的地方
    Javascript浏览器关于scrollLeft,scrollTop的兼容性
    Mozilla Firefox15怎么样才能把标签页弄到下面去,就和360的一样,Mozilla Firefox15没有取消标签置顶这个选项……
    Delphi过程函数传递参数的几种方式
  • 原文地址:https://www.cnblogs.com/benjamin77/p/9501480.html
Copyright © 2020-2023  润新知