• docker 入门5


    入门,第 5 部分:堆栈

    先决条件

    • 安装 Docker 版本 1.13 或更高版本。 

    • 获取第 3 部分先决条件中所述的 Docker Compose。

    • 获取 Docker Machine,如第 4 部分先决条件中所述。

    • 阅读第 1 部分中的方向。

    • 了解如何在第 2 部分中创建容器。

    • 确保通过将friendlyhello镜像推送到 registry 来发布您创建的friendlyhello镜像。我们在这里使用那个共享镜像。

    • 确保镜像用作已部署的容器。运行此命令,在信息中键入usernamerepo, 和 tag:docker run -p 80:80 username/repo:tag,然后访问http://localhost/

    • 请从第 3 部分获得 docker-compose.yml 的副本。

    • 确保第 4 部分中设置的机器已运行并准备就绪。运行 docker-machine ls 来验证这一点。如果machines停止,则运行 docker-machine start myvm1 以启动管理器,然后运行 docker-machine start myvm2 以启动辅助角色。

    • 让你在第4部分创建的群运行并准备就绪。运行 docker-machine ssh myvm1 "docker node ls" 来验证这一点。如果群已启动,则两个节点都会报告ready。如果没有,请重新初始化群并加入工作人员,如设置群中所述。

    介绍

    在第 4 部分中,您学习了如何设置一个swarm,即运行 Docker 的machines群集,并将应用程序部署到该swarm,容器在多台计算机上协同运行。

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

    一些好消息是,自第 3 部分以来,您一直在使用stack,此时您创建了一个Compose文件并使用 docker stack deploy。但是,这是在单个主机上运行的单个服务stack,这通常不是生产环境中发生的情况。在这里,您可以获取所学知识,使多个服务彼此相关,并在多台计算机上运行它们。

    你做得很好,这是the home stretch!

    添加新服务并重新部署

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

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

       
      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关键字,确保此服务仅在swarm manager上运行 - 从不为worker运行。这是因为此容器由 Docker 创建的开源项目构建,显示在关系图中的swarm上运行的 Docker 服务。

      我们马上就更多地讨论placement constraints和volumes。

    2. 确保shell配置为与 myvm1 对话(完整示例在此处)。

      • 运行 docker-machine ls 列出计算机并确保已连接到 myvm1,如其旁边的星号所示。

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

        在 Mac 或 Linux 上,命令是:

        eval $(docker-machine env myvm1)
         在 Windows 上,命令是:
         
        & "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression
    3. 在manager上重新运行 docker stack deploy命令,并且需要更新的任何服务都得到更新:

       
      $ docker stack deploy -c docker-compose.yml getstartedlab
      Updating service getstartedlab_web (id: angi1bf5e4to03qu9f93trnxm)
      Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
    4. 看看visualizer可视化工具。

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

      可视化工具visualizer的单个副本正按预期在manager上运行,并且 Web 的 5 个实例分布在swarm中。您可以通过运行 docker stack ps <stack> 来证实此可视化效果:

       
      docker stack ps getstartedlab

      可视化工具visualizer是一个独立的服务,可以在包含它在stack中的任何应用中运行。它不依赖于任何其他内容。现在,让我们创建一个确实具有依赖项的服务:提供访问者计数器的 Redis 服务。

    保留数据

    让我们再次通过相同的工作流来添加用于存储应用数据的 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 库中具有官方镜像,并且被授予了刚刚 redis 的简短image名称,因此这里没有用username/repo表示法。Redis 端口 6379 已由 Redis 预配置,以便从容器向主机公开,在我们的Compose文件中,我们将从主机向世界公开它,因此您可以实际将任何节点的 IP 进入 Redis Desktop Manager 并管理此 Redis实例,如果您选择。

      最重要的是,redis 有一些使数据在此stack部署之间持久的规范:

      • redis 始终在manager上运行,因此始终使用相同的文件系统。

      • redis 在容器内以 /data 挂载主机文件系统中的任意目录,这是 Redis 存储数据的地方。

      总之,这在主机的物理文件系统中为 Redis 数据创建了一个"真相源"。如果没有此,Redis 会将其数据存储在容器文件系统中的 /data 中,如果重新部署该容器,该文件系统将消失。

      这个真理之源有两个组成部分:

      • 在 Redis 服务上标记 placement constraint,确保它始终使用相同的主机。

      • 创建一个 volume ,路径 ./data(在主机上)作为 /data(在 Redis 容器内)的volume。当容器被拆掉和重新部署时,存储在指定主机上 ./data 上的文件将保留,从而实现连续性。

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

    2. 在manager上创建 ./data目录:

       
      docker-machine ssh myvm1 "mkdir ./data"
    3. 确保shell配置为与 myvm1 对话(完整示例在此处)。

      • 运行 docker-machine ls 列出计算机并确保已连接到 myvm1,如其旁边的星号所示。

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

        在 Mac 或 Linux 上,命令是:

         
        eval $(docker-machine env myvm1)

        在 Windows 上,命令是:

         
        & "C:Program FilesDockerDockerResourcesindocker-machine.exe" env myvm1 | Invoke-Expression
    4. 再运行 docker stack deploy 一次。

       
      $ docker stack deploy -c docker-compose.yml getstartedlab
    5. 运行 docker service ls 以验证三个服务是否按预期运行。

       
      $ docker service ls
      ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
      x7uij6xb4foj        getstartedlab_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
      n5rvhm52ykq7        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
      mifd433bti1d        getstartedlab_web          replicated          5/5                 gordon/getstarted:latest    *:80->80/tcp
    6. 检查其中一个节点,如http://192.168.99.101,并查看访问者计数器的结果,该计数器现在实时显示并存储在 Redis 上的信息。

      此外,请检查任一节点的 IP 地址端口 8080 处的可视化工具,并注意到 redis 服务与 Webvisualizer服务一起运行。

    回顾(可选)

    您了解到, stacks是相互关联的服务,都协同运行,这 - 惊喜!-- 自本教程的第三部分以来,您一直在使用stack。您了解到,要向stack添加更多服务,请将它们插入到Compose文件中。最后,您了解到,通过使用放置placement constraints 和 volumes的组合,您可以创建永久的永久主状态数据,以便在容器被拆掉和重新部署时,应用的数据能够存活下来。

  • 相关阅读:
    微信小程序之 3d轮播(swiper来实现)
    微信小程序之canvas 文字断行和省略号显示
    iframe 自适应高度、父子页面传值、回调
    微信小程序之动态获取元素宽高
    微信小程序之自定义select下拉选项框组件
    使用text-align:justify,让内容两端对齐,兼容IE及主流浏览器的方法
    bind,apply,call,caller,callee还傻傻分不清楚?
    JVM从零学习(三)虚拟机栈
    JVM从零学习(二)PC Register程序计数器
    JVM从零学习(一)运行时数据区及线程
  • 原文地址:https://www.cnblogs.com/13yan/p/11248481.html
Copyright © 2020-2023  润新知