我曾在使用微服务的不同公司工作。 然后他们在docker容器中运行它们。 现在,我正在一个项目中工作,尽管它是一个整体,但在容器中运行它仍然更加方便。
一方面,Docker是一种非常通用的工具,可以轻松有效地用于解决大量任务。 这是可以理解的,并且似乎一切都是基本的。 但是,另一方面,如果您不花费时间和资源来“泵送”正确使用它,则可能会使简单的事情变得过于复杂。 当然,您会假设您是对的,而Docker是中等大小的垃圾,不适合解决您的独特任务。
通常,在标准公司中,完成任何任务的过程如下:
- git push通过我们的提交完成
- 系统会被触发,例如Jenkins,TeamCity等。
- 启动管道/作业,在其中下载第三方库,编译项目,运行测试
- 创建具有组装项目(ADD ..)的Docker映像并将其推送到远程Docker注册表中
- 以某种方式,在远程服务器上,完成了docker pull(厨师,木偶,通过docker-compose手动进行),然后容器启动。
凭直觉,我总是觉得这一切都太复杂了。 这个过程被称为CI / CD,我已经厌倦了这么聪明的人,他们毫无疑问地认为这是最简单的方法。
对于最终用户,它看起来像这样:通过推送到git存储库,提交中的内容在某个地方展开。
我不喜欢这种方法。
- 将系统部署到远程服务器的唯一方法是完成所有5个步骤。
- 在第3步中,您可能需要访问私有库的密钥。 如果未配置先前下载的库的缓存,则过程可能很长。
- 您需要准备Dockerfile,确定映像(FROM ...),确定我们将如何标记映像,并需要访问将映像推送到的存储库。
- 需要您自己的存储库,配置https。 毕竟,泊坞窗客户端只能在https上工作。
第四段当然只做一次,也许不应该添加。
但是在发布阶段已经提到Docker这个词多少次了?
考虑一下:为什么我们要提前拖所有这些Docker? 因为人们相信该容器很方便,并且“嗯,一切都很好,它可以工作。 那你从什么开始?”。
因此,对于这样的人,我可以说-Docker容器不是万灵药,也不是您的应用程序可以运行的唯一环境。 用python,php,js,swift,scala / java等编写的项目 可以运行在:
- 远程虚拟机
- 在没有任何虚拟化和Docker容器的本地主机上。
突然之间:)
假设我们正在制作将在nodeJS上运行的服务。
该项目的结果(或我称之为“工件”)将是一组js文件(服务本身)+ node_modules(服务中使用的第三方库)。
假设我们确保该服务正在运行,并且希望远程运行它,以便我们的测试人员可以对其功能进行测试。
您如何看待这个想法:
- 我们用我们的项目制作.tar.gz并将其上传到...工件的远程存储库! (这种存储库也称为“二进制存储库”)。
- 我们说出他们可以用来下载我们的服务并开始测试的URL。
此外,测试人员可以在家里本地启动服务(如果有的话),也可以创建Dockerfile,在其中下载工件并直接启动容器。 好吧,还是别的。
如果您不想让测试人员启动docker容器,并且通常来说“不是他们的工作”来启动,请立即使用,然后使用一种工具,该工具会在二进制存储库中出现新工件时立即收集图像(使用网络挂钩,定期追逐王冠)。
现在从二进制存储库中有:
Nexus易于使用,它具有许多可以创建的存储库(npm,maven,raw,docker),因此我可以使用它。
这是一个该死的简单想法,为什么我在任何地方都没有读到它? 互联网上没有文章“像在某些kubernetes中部署容器的git push上一样”。 从这样复杂的算法中,头发直立。
这篇文章的目的是说-不需要在一个过程中组装项目并将其添加到Docker映像中。
分而治之!
生成项目,在可下载的位置发布工件。 (Docker注册表不是唯一可以存储项目,选择用于将工件交付到服务器的通用路径的地方)。
使用单独的工具,将工件交付到您的项目将在其中运行的服务器。
一切都非常简单,给其他人一个选择:使用docker,在kubernetes中运行或使用任何其他工具运行工件。 尽管您觉得它非常方便和时尚,但无需强加使用技术。
祝您启动项目好运!