堆栈(Stacks)
堆栈(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)
- 查看可视化界面
你在Compose文件中看到,可视化工具在端口8080上运行。通过运行docker-machine ls来获取其中一个节点的IP地址。 转到8080端口的IP地址,您可以看到可视化器正在运行:
可视化器的单个副本按照预期在manager上运行,并且网络的5个实例遍布整个群集。 你可以通过运行docker stack ps 来确认此可视化:
docker stack ps getstartedlab
- 1
- 2
可视化器是一个独立的服务,可以在包含它的任何应用程序中运行。 它不依赖于其他任何东西。现在让我们创建一个具有依赖性的服务:提供访问者计数器的Redis服务。
数据持久化
让我们再次通过相同的工作流程来添加用于存储应用程序数据的Redis数据库。
- 保存这份新的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
- 运行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)的更多相关文章
- C++ Stacks(堆栈)
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. 操作 比较和分配堆栈 empty() 堆栈为空则返回真 pop() ...
- 2.Stacks(堆栈)
一.概述 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,也就是说实现了一个先进后出(FILO)的数据结构. 二.常用API empty() 堆栈为空则返回真 pop() ...
- docker从零开始(五)堆栈初体验,stacks
先决条件 安装Docker 1.13或更高版本. 获取Docker Compose,请参考第三节 按照第四节中的描述获取Docker Machine. 在第二节中了解如何创建容器. 确保您的图像作为已 ...
- 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 ...
- [转]Android下打印调试堆栈方法
http://blog.csdn.net/freshui/article/details/9456889 打印堆栈是调试的常用方法,一般在系统异常时,我们可以将异常情况下的堆栈打印出来,这样十分方便错 ...
- Implement Queue using Stacks(用栈实现队列)
Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of ...
- LeetCode(23)-Implement Queue using Stacks
题目: Implement the following operations of a queue using stacks. push(x) -- Push element x to the bac ...
- 【IT笔试面试题整理】堆栈和队列
如何准备: Whether you are asked to implement a simple stack / queue, or you are asked to implementa modi ...
- 612.1.003 ALGS4 | Stacks and Queues
Algorithm | Coursera - by Robert Sedgewick Type the code one by one! 不要拜读--只写最有感触的!而不是仅仅做一个笔记摘录员,那样毫 ...
随机推荐
- iPhone 横屏时默认会放大文字的问题
有人说用 html { text-size-adjust: 100%; }我发现这个并不能解决问题.下面代码可以完美解决. 添加标签:<meta name="viewport" ...
- Python学习笔记:PEP8常用编程规范
PEP8编码规范是一种非常优秀的编码规范,也得到了Python程序员的普遍认可,如果实践中或者项目中没有统一的编码规范,建议尽量遵循PEP8编码规范,当然如果项目中已经有了自身的编码规范,应当优先遵循 ...
- 12-optionBinding
1-创建一个空的dotnet mvc网站 2- 创建appsettings.json文件, 这文件会默认被绑定 { "ClassNo": "1", " ...
- RSA 加解密算法详解
RSA 为"非对称加密算法".也就是加密和解密用的密钥不同. (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后 ...
- Result Maps collection does not contain value for XXXXX
在做mybatis多表查询的时候,出现了下面的错误: java.lang.IllegalArgumentException: Result Maps collection does not conta ...
- 剑指Offer - 九度1513 - 二进制中1的个数
剑指Offer - 九度1513 - 二进制中1的个数2013-11-29 23:35 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. ...
- 《Cracking the Coding Interview》——第13章:C和C++——题目1
2014-04-25 19:13 题目:用C++写一个读取文件倒数K行的方法. 解法:因为是要取倒数K行,所以我的思路是一行一行地读.过程中需要保存一个长度为K的链表,每次新读到一行都将表头节点移到表 ...
- 21、AngularJs知识点总结 part-3
1.选择框select 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,也可以使用ng-repeat 指令来创建下拉列表: 区别:ng ...
- PhpStorm 格式化中花括号缩进方式
格式化前: function func() { return ; } 格式化后: function func() { return ; } 在PhpStorm中的配置:File -> Setti ...
- flask利用session身份伪造
想研究很久了,这次终于初步了解了flask session伪造(得知道密钥). python2和python3 session解密不一样,而且不都是base64,脚本https://github.co ...