docker集群_使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署...

docker集群

Docker非常适合在单个节点上运行隔离的容器。 但是,大多数软件系统都在多个节点上运行,因此,除了Docker之外,我们还需要某种方法来指定哪些容器应在哪些节点上运行。

MQPerf-deployment-blog-logos-1-300x216

我要解决的特定问题如下:我有两个Scala守护程序,我想在多个节点上运行(取决于配置,每个节点可以运行一个或两个守护程序)。 我想要一种在集群中部署修改后的二进制文件的快速方法。 我也不想花费太多时间来设置服务器。 (我的Gentoo日子已经过去了。)

我到达的最终解决方案涉及Docker , OpsWorks , Chef和Vagrant 。 但是,一步一步来。

顺便说一句-您将如何解决上述问题? 请评论。

打包Java / Scala应用程序

首先,我需要能够打包和上传二进制文件。 在这里,Docker非常完美。 我编写了一个简单的Dockerfile ,其中:

  • 基于受信任的ubuntu + java7映像–无需在服务器上安装Java!
  • 将胖子从我的磁盘复制到映像
  • 指定使用复制的jar运行Java的入口点

完整的Dockerfile可以在这里找到: https ://gist.github.com/adamw/166b82ec04c9c0f67453。

有了这样的映像,我可以将其推送到(公共或私有) Docker注册表中 ,群集中的节点可以在该注册表中进行下载。

如果需要,我还可以安装我的应用程序需要的任何其他操作系统级别的依赖项,而不必担心版本冲突并在实际服务器上进行设置。

如果看一下Dockerfile,您可能会注意到有两个jar。 这样做是为了最小化每次代码更改后必须上传的Docker映像的大小。 第一个jar仅包含依赖项(Scala库,日志记录库,框架等)。 第二个jar包含已编译的应用程序代码。 从Dockerfile构建Docker映像时,将创建一系列中间映像,每个步骤之后一个。 对于涉及相同文件的相同命令,不会创建新映像,但是会从Docker缓存中重新使用映像。

依赖关系很少改变,因此通常dep-jar保持不变,因此缓存的版本会被重用(并且中间映像会上传一次)。 另一方面,应用程序代码始终会更改。 重要的是,首先将依赖项jar添加到映像中,以便中间映像包含dep,但不包含应用程序代码(更改后的代码)。 最后,通常只需要上传2-3MB。

不过,这里要注意一件事。 在确定是否可以在ADD命令(该命令将文件从本地磁盘复制到该映像)之后重新使用该映像时,Docker仅检查该文件的最后修改时间戳。 这将导致依赖项fat-jar在每次重新构建时都被重新添加,即使它们是相同的。 因此,我创建了一个简单的bash脚本,仅当其md5校验和发生更改时,该脚本才会复制dockerfile旁边的fat-jar(作为Docker上下文的一部分从该文件上传): https : //gist.github.com/adamw/ ba5d8b79ff553fba83fd 。

如何使用SBT创建这样两个单独的jar? 非常简单。 只需使用SBT Assembly插件并更改其设置即可:

assemblyOption in assembly ~= { _.copy(includeBin = true, includeScala = false, includeDependency = false) }

然后, assemblyPackageDependency目标将创建仅依赖项的jar,而assembly将创建仅应用程序的jar。

设置服务器

随着包含我们应用程序的Docker镜像在云中(在Docker集线器上)在等待,现在是时候设置服务器了,Docker守护程序将在其中运行容器。

为了配置服务器,我选择了Amazon OpsWorks的Chef,这有两个原因:可以使用Stacks和Layers清楚地分离和组织EC2实例,这些服务器与Chef具有现成的集成,并且使用自定义厨师食谱非常容易。 完全不需要手动实例设置!

以下步骤部分是摘要,部分是ShopIgniter博客上描述的内容的扩展。

Chef安装程序(由OpsWorks运行)将是最少的,并且仅包括运行Docker所需的内容。

首先,我们需要创建一个具有更新内核的基于Ubuntu 12.04的AMI(14.04尚不适用于OpsWorks)–有关详细信息,请参阅ShopIgniter的博客。

其次,我们将使用自定义的厨师食谱; 为此,您需要创建一个专用的存储库(例如在GitHub上)。 食谱非常基本和简单: https : //gist.github.com/adamw/792f8c22abb09699b6d5 。

总结一下:

  • docker::setup安装Docker
  • docker::kill_containers杀死并删除所有正在运行的容器
  • docker::myapp从Docker注册表中提取myapp映像并运行一个容器,该容器具有例如Chef-JSON配置文件的每个应用程序部分中指定的命令行参数和环境变量(此处我们的应用程序使用单个命令-line参数,并且需要环境中的AWS凭证):
{"myapp": {"image": "adamw/myapp:latest","cmdline": [ "com.softwaremill.myapp.Main", "10" ],"env": {"AWS_ACCESS_KEY_ID": “...","AWS_SECRET_ACCESS_KEY": “..."}}
}

配置OpsWorks

要配置OpsWorks,我们需要使用自定义Chef食谱和自定义配置JSON创建一个Stack,例如上面的示例(对于要运行的每个应用程序/容器类型,我们需要在配置JSON中有一个部分)。 其次,对于我们要部署的每个应用程序(容器),我们需要创建一个图层。 由于这些层只能运行Docker,因此我们不使用任何预配置的层,而使用“自定义”层。

该层将包含我们的自定义配方:在Setup阶段,我们需要使用docker::setup配方,在Deploy阶段,我们需要使用docker::kill_containersdocker::kill_containers docker::myapp配方。

现在,每次在该层上运行Deploy阶段时,Docker都会提取映像并运行指定的容器! 通过创建具有适当配方的图层,我们可以在任何节点上启动容器的任何组合。

opsworks1-300x233

运行部署阶段

要一次单击即可实际运行Deploy阶段,我们需要创建一个虚拟的OpsWorks应用程序:只需选择“类型:其他”和“存储库类型:其他”。 现在,每次要在服务器上部署应用程序(运行更新的Docker容器)时,只需将此虚拟应用程序部署在所需的实例或层上即可。

这也可以通过API调用来完成(就像AWS上的一切一样)! 因此,构建应用程序,创建Docker映像,推送该映像以及在OpsWorks上运行部署的整个过程可以非常容易地实现自动化-例如在成功构建之后。

一切就绪之后,我们现在可以将新实例添加到图层,启动和停止它们,并让多节点集群运行我们的应用程序! 要更新应用程序,只需将二进制文件推送到注册表即可。

在本地测试厨师

虽然Chef的食谱非常少,但仍然可以在本地对其进行测试仍然很有用。 使用Vagrant可以轻松实现。 使用Vagrant,我们可以轻松地创建安装了Chef的虚拟机,该虚拟机运行我们的配方,从而运行Docker容器。 此特定情况的Vagrantfile在这里: https ://gist.github.com/adamw/bf6fa803b6b13fd7430b。

Vagrantfile包含对我们正在开发的Chef食谱的引用(通过chef.cookbooks_path ),并且具有与OpsWorks中使用的相同的配置JSON。

发布vagrant up ,我们将运行虚拟机。 更改食谱或上载新容器后,我们可以通过使用vagrant provision --provision-with chef_solo轻松地重新运行Chef食谱。

加起来

我们最终得到以下关注点分离:

  • Docker –在隔离的容器中运行应用程序,具有所有必需的依赖关系
  • Chef –在定义的节点上设置docker,运行并链接具有指定参数/环境的容器
  • OpsWorks –管理实例,触发部署
  • 流浪汉–整个设置的本地测试

尽管在上述整个过程中肯定有一些事情可以简化(我希望Atomic项目能够做到这一点!)最后,在集群中轻松地部署新版本的修改后的应用程序是轻而易举的,这提供了开发环境。

翻译自: https://www.javacodegeeks.com/2014/06/cluster-wide-javascala-application-deployments-with-docker-chef-and-amazon-opsworks.html

docker集群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCM信号是什么信号?

PCM信号是模拟信号呢,还是数字信号呢?当然是数字信号啦!PCM的完整定义是:将模拟信号的抽样量化值变换成代码称为脉冲编码调制(PCM设备)。 在光纤通信系统中,光纤中传输的是二进制光脉冲“0”码…

SDH光传输设备是什么?SDH设备特点介绍

SDH光传输设备是一种,将复接、线路传输以及交换功能融合为一体的、并且由统一网管系统操作的综合信息传送网络。SDH光传输设备,他可实现网络有效管理、能实时业务监控、能动态网络维护、不同厂商设备间的互通等多项功能。 SDH光传输设备能大大提高网络资…

通过MicroProfile上下文传播增强了CDI上下文和隔板

当将CDI与异步执行方法(例如ManagedExecutorService ,传统上不可能访问在原始线程中处于活动状态的所有CDI范围。 MicroProfile Context Propagation可以定义线程执行上下文并将其传递到完成阶段,尽管我们的代码是异步执行的,但它…

ProtoBuff3.0.0在Ubuntu上安装

ProtoBuff3.0.0在Ubuntu上安装 最近安装ns3,运行别人代码,编译build.py时出现需要update Proto的问题,本来想安装最新版本,因为需要翻墙,就参考大部分博客,安装3.0.0版本。(备注:直…

SDH与PDH的区别介绍

PDH准同步数字系列,1-4次群2048K、8488K、34368K、139264K,有美国/日本标准和欧洲标准,我国沿用的是欧洲标准;30/32路组成一个1次群;各个厂家产品大多互相不兼容。 SDH同步数字系列,网元都带PDH接口&#…

Ubuntu 系统入门

1 Ubuntu 常用文件夹处理命令 1、 cd … //返回上一层目录 cd / //返回根文件夹 2、ls 列出文件名称 3、unzip XXX 对zip 压缩包解压 4、sudo baobab 进行磁盘空间分析 5、 利用vim修改只读文件内容 ::w !sudo tee % (注意空格) 2 Ubuntu显示隐藏文件 …

什么是MSTP(多业务传输平台)?

Multi-Service Transfer Platform简称MSTP,他是基于SDH的多业务传送平台的,同时也实现TDM、ATM、以太网等业务的接入、处理和传送,提供统一网管的多业务节点。 当前通信时代随着不断增长的IP数据、话音、图像等多种业务传送需求扩展&#xf…

spring boot示例_Spring Boot上的Spring社交示例,或者我如何停止担心和喜欢自动配置...

spring boot示例对于Spring Boot 1.1.0.RC1,添加了自动配置和Spring Social的启动程序pom,这意味着我不必向pom添加一百个依赖关系,并且将为我处理许多毫无意义的Spring配置。 让我们来看一个例子。 我将实现一个两页的Web应用程序。 一个将…

安装虚拟机后,启动出错的解决办法

安装虚拟机后,启动出错,需要找到路径中的配置文件 使用记事本或其他应用打开 在vmci0.prensent值改为FALSE,才可以正常启动

什么是E1接口,E1的使用注意事项

欧洲的30路脉码调制PCM简称E1,速率是2.048Mbit/s 。 我国采用的是欧洲的E1标准。E1接口有G.703非平衡的75 ohm,平衡的120 ohm2种接口。接下来就由飞畅科技的小编来为大家详细介绍下使用E1的三种方法及注意事项,一起来看看吧&#…

Java序列化魔术方法及其示例使用

在上一篇文章中, 您需要了解有关Java序列化的所有知识 ,我们讨论了如何通过实现Java序列化来启用类的可序列化性。 Serializable接口。 如果我们的类未实现Serializable接口,或者该类具有对非Serializable类的引用,则JVM将抛出No…

主机文件复制到Ubuntu系统中

实现这个功能,需要VMware Tool安装 在虚拟机选项卡中安装VMware Tool 将DVD盘中压缩包复制到home文件夹 解压后,进入该文件夹,打开终端,执行安装文件 安装完成后重启电脑即可 ------------------------------------ 参考链接…

光纤的熔接,光纤接续步骤小知识

做光纤工程的应该都知道,光纤熔接接续是光纤传输系统中工程量最大、技术要求最复杂的重要工序,其质量好坏直接影响光纤线路的传输质量和可靠性。进行有效的方法及正确熔接步骤极其重要的。今天就由飞畅科技的小编来为大家介绍一下光纤光缆的熔接步骤与三…

解决sudo apt-get update联网失败问题

更改源为中科院参考链接 源为清华参考链接2

ubuntu语言设置问题

ubuntu语言设置问题 参考博客ubuntu设置语言

针对新手的Java EE7和Maven项目-第2部分-为我们的应用程序定义一场简单的战争

从第一部分恢复 第1部分 我们刚刚定义了父 pom。 一种特殊的pom类型,它最终定义了我们的应用程序将要使用的库。 它还配置了所有用于包装我们应用程序每个模块的Maven工具。 您可以在此处 签出 -1部分示例代码。 因此,到目前为止,在将要开发…

电信级E1保护倒换设备产品介绍

1-8路E1倒换保护设备是由杭州飞畅科技有限公司自主研发生产的E1线路无损伤自动切换设备。本系列设备是本公司研制的专用超大规模集成电路的基础上开发的E1切换器。提供1-8路独立的E1倒换保护功能(816E1),在默认工作方式下,主用E1线路出现故障时&#xff…

电脑杀毒优化问题

实测有用: 软件杀毒与卸载 哔哩哔哩杀毒卸载 电脑性能显卡优化 N卡优化

定制基元和DTO的(反)序列化和验证

最近,我们为您提供了新的HTTP框架HttpMate。 在引言文章中 ,我们将请求和响应映射到域对象称为“最复杂的技术细节”,以及如何通过另一个伴侣MapMate帮助我们。 实际上,在将请求属性映射到您的域对象时,MapMate减轻了…

UBUNtu·E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法

E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/ 加锁 问题解决方法 参考链接1 参考链接2