对于我们的开发调试简易性和部署问题,我们计划将我们的服务集中化。例如。
我有A
,B
,C
和D
等服务。其中A
是我的开发代码(经常更改),B,C和D是依赖服务。
目前,B
,C
和D
计划远程部署,因为它们只是一个依赖项(Docker容器)
我想要一种调试/部署的方法,以便
我的服务A
可能位于本地,可以轻松连接远程Docker服务B
,C
,D
或者A
可以某种方式部署到远程群集,并且可以对其进行测试。
我想到了推送到注册表,但每个开发人员都推送了他自己的快照,但却无法将其他图片联合起来。
注意:
我不想要Swarm类似的东西,但希望保持简单。
群集通过Docker Machine进行管理。它可以被替换吗?
这些服务由Docker Compose编织。
关于如何驾驶这个的任何建议?另一种首选方式是通过Docker。
答案 0 :(得分:1)
与我分享我的经验的简化版本。要考虑在远程docker引擎上运行依赖项(B
,C
和D
)是否值得麻烦,以下其中一项必须(通常)为真:
使用远程方法可能会丢失的内容有点吓人。
还有许多其他要点可以添加到这些列表中,但这些对我们来说非常重要。
我们采用混合方法。
开发人员将在本地运行大多数任务。我们减少了本地开发依赖服务所需的数据,因此他们可以在几分钟内在本地启动。使开发环境完全“离线”是一个巨大的优势。如果集中式系统发生故障,您的开发人员很快就会被沦为在停机期间漫游建筑物的大群僵尸。如果需要的话,他们还能够在火车上把他们的笔记本电脑调高并调试一些奇怪的问题,然后承诺并让CI系统在他们的个人生活中继续进行测试和诸如此类的东西。
此外,我们启动了一些运行依赖服务的docker引擎的VM。它们(大多数)具有live
和dev
名称前缀(以及其他需要时),并包含来自实时环境的快照。如果需要,开发人员可以使用单独的组合设置。当开发人员试图确定由不良数据或代码导致的问题时,这可能是实际的,这些数据或代码只会因较大的数据集而严重缩放。
永远不会改变的是A
始终在开发者计算机上运行。如果出于某种原因有人有其他需求,我们会启动一个带有docker引擎,一些数据快照和依赖服务的新VM。这是一个完全自动化的过程,因此这需要一个完善且高效的管道。如果我选择启动个人设置,主机名可以带有我的用户名的前缀。
我会说开发人员是否可以在本地运行所有内容,然后从大量工作中解脱出来并做到这一点。找到智能方法,让所有依赖服务在几分钟内顺利运行。
数据依赖性和隐私问题
我会在这里注意这一点,因为有太多人忽略了这一部分。
现在GDPR和Privacy Shield很可能会在2018年对隐私问题施加更大的压力(至少你们存储有关欧盟公民的数据),贵公司将不得不严肃对待或者可能面临巨额罚款和/或客户放弃您。这增加了一些工作。
dev
和live
主机还包含已转换的数据以隐藏身份,但会进行简化以大大加快流程。开发人员每天携带笔记本电脑旅行,甚至带回家。任何包含任何形式的个人信息的数据都不会落在开发者笔记本电脑上。
答案 1 :(得分:0)
我同意格瑞米的回答,但只是为了增加一些颜色,我想我已经描述了我们去年使用的系统效果很好。基本上,我们尝试在开发机器上尽可能地镜像我们的prod环境。我们直接在实例上运行一些服务(mongo,haproxy,etcd),其他一切都在Docker中运行。所以在开发机器上,除了Vagrant之外,我们也是这样做的。实际上,我们所有的AWS环境基本上都与prod环境相似,只是加上或减去规模/冗余。所有一次性"牛"这可以简单地重建。
我们拥有自己内部构建的古怪的小码头编排系统(pre-k8,pre-swarm),它基本上采用了应该运行的"的东西的声明性清单。并将其粘贴到etcd中。然后,在每个系统上的docker中运行的代理(对于vagrant,只有一个)检查图像和配置签名以查看实际运行的内容,如果有任何缺失则运行它。 (如果有任何事情发生,那不应该是,杀死它)。对于网络路由,有一些可怕但令人惊讶的haproxy操作来自etd的confd模板,我不想再次触摸:-)将请求路由到正确的docker后端,支持蓝绿色部署。
对于开发工作,它完全一样。对于快速开发循环,你不想一直重建容器,这很烦人。因此,在集群清单中,我们有一个神奇的小标志,您可以指定在主机上标记一个服务为#34;。这通过相同的etcd / confd / haproxy的东西,但后端是你的开发系统!这里的一大好处是,您可以通过在prod中运行的完全相同的haproxy设置获得https路由到您正在测试的服务。
这是一所古老的学校,但我们爱 haproxy。 : - )
所以基本上,努力尽可能接近本地系统上完全孤立的产品环境。哦,努力争取不成为宠物。