堆栈(Stacks)

准备工作

  • 安装Docker 1.13及以上版本
  • 安装Docker Compose正如第三部分的准备工作。
  • 安装Docker Machine正如第四部分的准备工作。
  • 阅读第一部分的引导。
  • 学习怎么在第二部分创建容器。
  • 确保你已经发布friendlyhello 镜像,并推送到公共仓库。我们需要在这一部分用到这个镜像。
  • 确保你的镜像能够成为一个被部署的容器能正常工作。
  • 从第三篇文章拷贝一份docker-compose.yml
  • 确保第四部分的docker machine已经正确安装,通过docker-machine ls查看。
  • 确保docker swarm正确安装,并且运行。通过执行docker-machine ssh myvm1 “docker node ls 命令验证。

介绍

在第4部分中,你学习了如何设置一个swarm,这是一群运行Docker的机器,并为其部署了一个应用程序,应用才能修包含的众多容器在多台机器上运行。

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

好消息是,从第3部分开始,在创建Compose文件并使用Docker堆栈部署时,从技术上讲,你一直在使用堆栈。 但是,这是在单个主机上运行的单个服务堆栈,通常不会发生在生产环境中。 在这里,你可以把你学到的东西,使多个服务相互关联,并在多台机器上运行它们。

你做得很好,这就是主场!

添加一个新服务和重新部署

添加服务到docker-compose文件是非常简单的。首先,添加一个可视化界面的服务,可以让我们查看swarm正在调度的容器。

1.打开docker-compose文件,并将以下的内容替换成文件的内容。确保用你的镜像信息替换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: www.haiyuyule.com on-failure
      resources:
        limits:
          cpus:www.michenggw.com "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:www.qinlinyule.cn/ 8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: www.xuancayule.com/ [node.role == manager]
    networks:
      - webnet
networks:

这里新增的唯一东西就是网络对等服务,名为可视化器。 在这里注意两件新事物:一个volumes ,让可视化工具访问Docker的主机套接字文件和一个placement 键,确保这项服务只能在群集管理器上运行 - 从不是工作者。 这是因为这个容器是由Docker创建的一个开源项目构建的,它显示了在一个图表中的Swarm上运行的Docker服务。

我们稍后会详细讨论lacement constraints 和volumes 。

2.确保你的shell被配置为与myvm1进行通信(完整的例子在这如下)。

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

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

在Mac或Linux上,命令是:

eval $(docker-machine www.xuancayule.com/ env myvm1)
  • 1

3.在manager上重新运行docker stack deploy命令,并且需要更新的任何服务都会更新:


$ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web www.wanmeiyuele.cn (id: angi1bf5e4to03qu9f93trnxm)
Creating service getstartedlab_visualizer (id: l9mnwkeq2jiononb5ihz9u7a4)
  1. 查看可视化界面

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

可视化器的单个副本按照预期在manager上运行,并且网络的5个实例遍布整个群集。 你可以通过运行docker stack ps 来确认此可视化:

docker stack ps getstartedlab
  • 1
  • 2

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

数据持久化

让我们再次通过相同的工作流程来添加用于存储应用程序数据的Redis数据库。

  1. 保存这份新的docker-compose.yml文件,它最后添加了一个redis服务。确保用的镜像信息替换掉username/repo:tag的内容。
version: "3"
services:
  web:
    # replace username/repo:tag with www.boshenyl.cn  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的简短镜像名称,所以在这里没有username/repo符号。 Redis端口6379已经由Redis预先配置为从容器暴露给主机,并且在我们的Compose文件中,我们将它从主机展示给所有容器,因此你可以实际输入任何IP的IP 节点添加到Redis桌面管理器中并管理此Redis实例,如果愿意的话。

最重要的是,redis规范中有几件事情使数据在这个堆栈的部署之间持久化:

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

这就是在主机物理文件系统中为Redis数据创建“source of truth”。 如果没有这个,Redis会将其数据存储在容器文件系统中的/ data中,如果该容器曾经被重新部署,该数据将被清除。

真实的数据源(source of truth)由2部分组成:

  • 放置在Redis服务上的 placement constraint,确保它始终使用相同的主机。
  • 创建的volume ,允许容器作为/ data(位于Redis容器内)访问./data(在主机上)。 在容器重复开启和关闭时,存储在指定主机上的./data文件仍然存在,从而保持连续性。

2.在manager上创建一个./data目录

docker-machine ssh myvm1 "mkdir ./data"
  • 1
  • 2

3.确保你的shell被配置为与myvm1进行通信(完整的例子在这里)。

  • 运行docker-machine ls命令,列出所有的机器和确保你已经连上myvm1。
  • 如果需要,重新运行docker-machine env myvm1命令,然后再运行以下命令:
eval $(docker-machine env myvm1)
  • 1
  1. 运行docker stack deploy命令
$ docker stack deploy -c docker-compose.yml getstartedlab
  • 1

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                 orangesnap/getstarted:latest    *:80->80/tcp

6.查看你的机器的一个节点的web页面,比如http://192.168.99.101,并且查看访客计数的结果,该计数现在已经存在并将信息存储在Redis上。

另外,请检查任一节点IP地址的端口8080处的可视化工具,并注意查看随Web和可视化工具一起运行的redis服务

堆栈(Stacks)的更多相关文章

  1. C++ Stacks(堆栈)

    C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() ...

  2. 2.Stacks(堆栈)

    一.概述 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构. 二.常用API empty() 堆栈为空则返回真 pop() ...

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

    先决条件 安装Docker 1.13或更高版本. 获取Docker Compose,请参考第三节 按照第四节中的描述获取Docker Machine. 在第二节中了解如何创建容器. 确保您的图像作为已 ...

  4. Cracking the Coding Interview(Stacks and Queues)

    Cracking the Coding Interview(Stacks and Queues) 1.Describe how you could use a single array to impl ...

  5. [转]Android下打印调试堆栈方法

    http://blog.csdn.net/freshui/article/details/9456889 打印堆栈是调试的常用方法,一般在系统异常时,我们可以将异常情况下的堆栈打印出来,这样十分方便错 ...

  6. Implement Queue using Stacks(用栈实现队列)

    Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...

  7. LeetCode(23)-Implement Queue using Stacks

    题目: Implement the following operations of a queue using stacks. push(x) -- Push element x to the bac ...

  8. 【IT笔试面试题整理】堆栈和队列

    如何准备: Whether you are asked to implement a simple stack / queue, or you are asked to implementa modi ...

  9. 612.1.003 ALGS4 | Stacks and Queues

    Algorithm | Coursera - by Robert Sedgewick Type the code one by one! 不要拜读--只写最有感触的!而不是仅仅做一个笔记摘录员,那样毫 ...

随机推荐

  1. 关于img底部空白

    <img>元素底部为何有空白? 问题: 最近听网课遇到这样一个问题,先po出代码如下: <!--html--> <div class="top"> ...

  2. CentOS 6.5通过yum安装 MySQL-5.5

    1.安装mysql-5.5的yum源 rpm -ivh http://repo.mysql.com/yum/mysql-5.5-community/el/6/x86_64/mysql-communit ...

  3. input标签中的name

    <input>标签是java web的jsp页面中最常用的标签,特别是用来在页面和servlet中传递内容, 但是我们看到<input>标签中有很多内容,这边我们只提一下主要的 ...

  4. Flask初学者:视图函数/方法返回值(HTML模板/Response对象)

    返回HTML模板:使用“from flask import render_template”,在函数中传入相对于文件夹“templates”HTML模板路径名称字符串即可(默认模板路径),flask会 ...

  5. wps取消英文首字母大写功能

    wps中关于首字母大写的功能还是很有用处的,但是有时候对于我们来说却是一种累赘,怎么取消这个功能呢? 新建一个文档之后,点击wps文字,选择工具,选项按钮 然后点击编辑,取消勾选键入时自动进行首字母大 ...

  6. [Codeforces958C2]Encryption (medium)(区间DP)

    Description 题目链接 Solution 显然的区间DP,正常想法f[i][j]表示前i个数分成j块,每次在i前找一个k使得balala,然而常规打法会超时 我们发现,对于i前面的所有点,他 ...

  7. IE浏览器调用ActiveX获取U盘中的文件

    <p> <script type="text/javascript" language="javaScript">// <![CD ...

  8. 10,python开发之virtualenv与virtualenvwrapper

      在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程 ...

  9. 2-安装linux7

    1.操作系统简介 操作系统: 桌面操作系统 redhat fedora slackware ubuntu debian suse linux centos 服务器操作系统 linux redhat s ...

  10. java 中实体Bean和Map互相转化

    技术交流群: 233513714 // 将一个map对象转化为bean public static void transMap2Bean(Map<String, Object> map, ...