堆栈(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. 在windows7上配置xampp虚拟主机

    在设置之前最好关闭xampp1.修改hosts文件进入C:\Windows\System32\drivers\etc目录,找到hosts文件.在# Localhost (DO NOT REMOVE) ...

  2. 【模板时间】◆模板·II◆ 树链剖分

    [模板·II]树链剖分 学长给我讲树链剖分,然而我并没有听懂,还是自学有用……另外感谢一篇Blog +by 自为风月马前卒+ 一.算法简述 树链剖分可以将一棵普通的多叉树转为线段树计算,不但可以实现对 ...

  3. JS中常犯错误

    01.==与=== 释: 在JavaScript中使用三等号来判断两个条件是否相等.使用等于关系运算符时,只有两边的条件相等时,结果才为真,否则就是假.注意等于关系运算符并不只是判断 数字类型的数据, ...

  4. ethereum(以太坊)(十)--函数修饰符

    pragma solidity ^0.4.0; contract modifierTest{ uint public v1; uint constant v2 =10; //uint constant ...

  5. google云函数实现BigQuery数据操作

    Google Cloud Function操作BigQuery数据库. 1.部署云函数时在配置文件中(package.json)添加一项 "@google-cloud/bigquery&qu ...

  6. pytorch中词向量生成的原理

    pytorch中的词向量的使用 在pytorch我们使用nn.embedding进行词嵌入的工作. 具体用法就是: import torch word_to_ix={'hello':0,'world' ...

  7. 【机器学习算法基础+实战系列】SVM

    概述 支持向量机是一种二分类模型,间隔最大使它有别于感知机.支持向量机学习方法由简至繁的模型:线性可分支持向量机(linear support vector machine in linearly s ...

  8. Java8 新API读取文件内容

    import java.io.IOException;import java.nio.charset.Charset;import java.nio.file.Files;import java.ni ...

  9. Android 判断屏幕方向一个大坑

    正常的判断屏幕方向的代码: /** 获取屏幕是否是竖屏 * @return */ @SuppressLint("SwitchIntDef") public boolean isSc ...

  10. HDFS写数据和读数据流程

    HDFS数据存储 HDFS client上传数据到HDFS时,首先,在本地缓存数据,当数据达到一个block大小时.请求NameNode分配一个block. NameNode会把block所在的Dat ...