转载请标明出处:

https://blog.csdn.net/forezp/article/details/80244682

本文出自方志朋的博客

堆栈(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: 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:

这里新增的唯一东西就是网络对等服务,名为可视化器。 在这里注意两件新事物:一个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 env myvm1)

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)
  1. 查看可视化界面

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

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

docker stack ps getstartedlab

可视化器是一个独立的服务,可以在包含它的任何应用程序中运行。 它不依赖于其他任何东西。现在让我们创建一个具有依赖性的服务:提供访问者计数器的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的简短镜像名称,所以在这里没有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"

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

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服务。




扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客

最新文章

  1. TabSiPlus发布1749版本
  2. LeetCode之Binary Tree Level Order Traversal 层序遍历二叉树
  3. iOS系统架构
  4. 不同操作系统上屏蔽oracle的操作系统认证方式
  5. CSS优先级别计算
  6. android studio使用的各种问题
  7. 【iOS】Swift ?和 !(详解)
  8. 云计算openstack共享组件(1)——时间同步服务ntp
  9. DBNavigator1 按钮标题中文 提示中文
  10. shell 文件操作
  11. go标准库的学习-strings-字符串操作
  12. 前端学习 -- Html&Css -- 层级和透明度
  13. Qt qDebug() 的使用方法
  14. 异步通信----WebSocket
  15. php mysql_connect pmysql_connect区别
  16. Java String和Date的转换 Date类型操作
  17. 一步步带你配置IIS(包括错误分析)
  18. 神经网络Batch Normalization——学习笔记
  19. 详解SimpleXML添加_修改_删除_遍历XML节点属性
  20. sql developer中英文切换

热门文章

  1. Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)
  2. .NET Core 部署到CentOS–1.创建项目,简单部署
  3. 纯代码编写的vc跳转SB
  4. Spring Chapter4 WebSocket 胡乱翻译 (二)
  5. Java内部类详解 2
  6. 重构指南 - 尽快返回(Return ASAP )
  7. 有关satement与preparedstatement
  8. 30 Excellent WordPress Video Tutorials
  9. Visual Studio Code打开终端控制台
  10. Sharepoint 2013企业内容管理学习笔记(一) 半自动化内容管理