不要过度简化您的CI / CD并有意义地使用Docker

我曾在使用微服务的不同公司工作。 然后他们在docker容器中运行它们。 现在,我正在一个项目中工作,尽管它是一个整体,但在容器中运行它仍然更加方便。

一方面,Docker是一种非常通用的工具,可以轻松有效地用于解决大量任务。 这是可以理解的,并且似乎一切都是基本的。 但是,另一方面,如果您不花费时间和资源来“泵送”正确使用它,则可能会使简单的事情变得过于复杂。 当然,您会假设您是对的,而Docker是中等大小的垃圾,不适合解决您的独特任务。

通常,在标准公司中,完成任何任务的过程如下:

  1. git push通过我们的提交完成
  2. 系统会被触发,例如Jenkins,TeamCity等。
  3. 启动管道/作业,在其中下载第三方库,编译项目,运行测试
  4. 创建具有组装项目(ADD ..)的Docker映像并将其推送到远程Docker注册表中
  5. 以某种方式,在远程服务器上,完成了docker pull(厨师,木偶,通过docker-compose手动进行),然后容器启动。

凭直觉,我总是觉得这一切都太复杂了。 这个过程被称为CI / CD,我已经厌倦了这么聪明的人,他们毫无疑问地认为这是最简单的方法。

对于最终用户,它看起来像这样:通过推送到git存储库,提交中的内容在某个地方展开。

我不喜欢这种方法。

  1. 将系统部署到远程服务器的唯一方法是完成所有5个步骤。
  2. 在第3步中,您可能需要访问私有库的密钥。 如果未配置先前下载的库的缓存,则过程可能很长。
  3. 您需要准备Dockerfile,确定映像(FROM ...),确定我们将如何标记映像,并需要访问将映像推送到的存储库。
  4. 需要您自己的存储库,配置https。 毕竟,泊坞窗客户端只能在https上工作。


第四段当然只做一次,也许不应该添加。

但是在发布阶段已经提到Docker这个词多少次了?

考虑一下:为什么我们要提前拖所有这些Docker? 因为人们相信该容器很方便,并且“嗯,一切都很好,它可以工作。 那你从什么开始?”。
因此,对于这样的人,我可以说-Docker容器不是万灵药,也不是您的应用程序可以运行的唯一环境。 用python,php,js,swift,scala / java等编写的项目 可以运行在:

  • 远程虚拟机
  • 在没有任何虚拟化和Docker容器的本地主机上。

突然之间:)

假设我们正在制作将在nodeJS上运行的服务。

该项目的结果(或我称之为“工件”)将是一组js文件(服务本身)+ node_modules(服务中使用的第三方库)。

假设我们确保该服务正在运行,并且希望远程运行它,以便我们的测试人员可以对其功能进行测试。

您如何看待这个想法:

  1. 我们用我们的项目制作.tar.gz并将其上传到...工件的远程存储库! (这种存储库也称为“二进制存储库”)。
  2. 我们说出他们可以用来下载我们的服务并开始测试的URL。

此外,测试人员可以在家里本地启动服务(如果有的话),也可以创建Dockerfile,在其中下载工件并直接启动容器。 好吧,还是别的。

如果您不想让测试人员启动docker容器,并且通常来说“不是他们的工作”来启动,请立即使用,然后使用一种工具,该工具会在二进制存储库中出现新工件时立即收集图像(使用网络挂钩,定期追逐王冠)。

现在从二进制存储库中有:

  • 声纳型
  • 人工工厂

Nexus易于使用,它具有许多可以创建的存储库(npm,maven,raw,docker),因此我可以使用它。

这是一个该死的简单想法,为什么我在任何地方都没有读到它? 互联网上没有文章“像在某些kubernetes中部署容器的git push上一样”。 从这样复杂的算法中,头发直立。

这篇文章的目的是说-不需要在一个过程中组装项目并将其添加到Docker映像中。

分而治之!

生成项目,在可下载的位置发布工件。 (Docker注册表不是唯一可以存储项目,选择用于将工件交付到服务器的通用路径的地方)。

使用单独的工具,将工件交付到您的项目将在其中运行的服务器。
一切都非常简单,给其他人一个选择:使用docker,在kubernetes中运行或使用任何其他工具运行工件。 尽管您觉得它非常方便和时尚,但无需强加使用技术。

祝您启动项目好运!

Source: https://habr.com/ru/post/zh-CN443136/


All Articles