Docker-它为我们的团队带来了什么样的真正价值?

我对Docker非常陌生。 我们的团队有一个非常好的部署线,我们有不同的CI引擎用于不同的项目,包括Jenkis和TeamCity。

开发人员通常需要签入,CI接pipe,部署,完全准备好testing团队进行testing。 我一直认为这是一个完美的模型。 当然,有些部分和我们的实现有其缺陷,但是对于我们想要的,它工作得很好。

现在,我们的Dev-Ops正在介绍Docker,其中testing团队从Docker Registry获取Docker镜像每次我们从teamcity运行构build。 虽然听起来真的很奇怪,但我仍然不明白它的好处。

经过我的研究,我的结论是,Dockers可以成为VM的轻量级替代品。 但是,只有如果你使用任何虚拟机? 我们没有使用任何VMS? 我只是不明白这里真正的价值是什么? 另外,在search时,我在Docker上find了一个相对较好的链接:

https://www.ctl.io/developers/blog/post/what-is-docker-and-when-to-use-it/

他们在哪里讨论什么时候应该使用Docker,其中一个观点是:

每当您的应用程序需要经历多个开发阶段(dev / test / qa / prod,尝试Drone或Shippable,都使用Docker CI / CD)时,请使用Docker

好。 但是请不要进一步阐述为什么当我的应用程序需要经历多个阶段时,docker是有用的吗?

当现有的设置已经运行平稳的时候,它是如何在普通的开发/testing中得到显着的帮助的?

首先,将它与虚拟机进行比较是正确的,因为它与虚拟机类似。 然而,docker是令人难以置信的轻量级。 这个属性是一开始我最惊讶的一个。 与虚拟机相反,容器可以更高效地共享资源。 虚拟机是孤立的。 容器可以在主机上同时运行,开销很小。 您可以将容器configuration为可以相互通信(通过卷或端口绑定)。

而且,在我的团队中,docker工人带来以下好处:

  • 我们的应用程序由一个大的应用程序和其他几个微服务组成。 但是,我们希望将所有应用程序之间的所有依赖关系发布为一个包,从而消除了在确定应该将哪个版本的应用程序和微服务部署在一起(兼容性)等问题。也就是说,该映像包含了您所需要的一切,您可以使用docker-compose将所有应用程序或一个接一个地上/下。 你不需要部署,你只需要拉图像并发射一个容器。 如果您想停止其中一项微服务,则可以在不影响其他服务的情况下完成。

  • 在团队中的开发人员,可以在本地机器上运行非常相同的图像,例如来解决生产中发生的问题; 这意味着可以在与生产环境相同的环境中进行故障排除。 这带来了环境标准化,不再“只能在机器上”讲话。

  • 它给我们带来的另一个好处是:我们build立一个docker镜像,运行我们的testing,一旦所有阶段都成功,就把它推送到registry,这意味着一个很好的可移植性。

  • 能够版本控制容器。 您可以轻松地检查当前版本和以前版本之间的容器。 如果你想回滚 – 这是顺利完成。

  • 隔离和保护应用程序。 所有容器都是隔离的,你可以很容易地控制进出的东西。

我花了一年才习惯了这个想法,但现在看起来很简单。

我认为其中的一部分来自人们不断称Docker为“虚拟机”的事实,这是不准确的。 这真的只是幕后发生的一个绰号。 在很多方面,Docker不会取代完整的虚拟化解决scheme,例如VMWare。 但是,它确实提出了一种思考基础设施的新方法。 很多人都困难的时间包扎着头。

你可以开始问自己:什么使得Linux发行版独一无二?

除了内核之外,其他的一切只是组织二进制文件,库,运行时和configuration文件的“标准方式”。 您需要/ bin中的二进制文件,/ lib中的lib文件,/ etc中的configuration文件。 用户安装位于/ usr下

大多数发行版将保留Unix的主要结构,并添加自己的怪癖。 每个人都将有自己的方式来pipe理和分发包。 每个人都将维护自己的版本的库,司机等

核心是内核。 这是他们都有的共同点。 如今,Linux内核的最新版本与几乎所有可用的主要发行版都兼容。 所以,除了/ boot之外,其他的大部分工作都只是将正确的文件放在正确的位置,并且拥有正确的权限。

现在,想象一下,将所有的发行包(内核除外)都放在运行的操作系统的另一个目录中。 利用你已经运行的相同的内核,你隔离一个新的进程,以便它“认为”/现在是该目录。 答对了! 现在这个过程“认为”它在另一个操作系统上自己运行。

Dockerbuild立在Linux容器的基础之上,这使得我们能够以更友善,更简单的方式做到这一点。 不要把它看作是一个虚拟机。 把它看作是进程隔离。 正在运行的内核将通过此进程共享机器资源,同时保持与系统其余部分的隔离。 这就像类固醇的监狱 。

这是一个广泛的简化。 但是,鉴于这个概念,想想这个概念的含义。

您可以在同一主机上使用完全不同环境的多个进程,否则这些进程可能会相互冲突。 一个可能是需要旧库的传统二进制文件(遗留下来的系统永远不会死掉)。 另一个可能是最新的尖端技术的构build。 共享相同的内核是一个高效的,有价值的资源pipe理。

我发现的最大价值来自pipe理基础设施。 一旦你在主机上安装Docker,configuration一个群集,并定义一个部署容器的方式,你大都忘了主机。 添加用户,安装软件包,自定义,编辑configuration文件…所有这一切成为您桌面上的开发任务。 有一个脚本更多的动机,自动化更多。 除非绝对必要,否则请勿将手放在物理或虚拟机器上。

有人改变服务器上一些模糊的设置来解决一些奇怪的应用程序行为,忘记告诉任何人关于它并休假的时代已经一去不复返了。 对环境的改变可以委托给版本控制,由团队中的每个人进行跟踪和改进。 如果数据中心发生灾难,重build整个环境就是重build映像和重新部署容器。 您的基础架构变得一致和可重复,同时保持对各种操作系统和各种应用的定制configuration敞开大门。

开发人员可以利用Docker的优势,在桌面上重新创build开发/升级/生产环境。 无需使用应用程序服务器和数据库安装来监视开发计算机,甚至不需要虚拟箱来模拟所有这些。

testing可以通过更高级别的隔离实现自动化。 Selenium团队已经有了正式的Docker镜像 。 创build一个完整的testing中心应该和那些小狗在公园散步。

构build定制软件,比如用第三方模块编译Nginx,也可以在专用映像的容器内完成。 没有必要保持整个服务器专用于它,甚至用所有的依赖性和构build包来监视你的桌面。

总的来说,我们一直在Docker方面有很好的经验。 我们已将迁移环境迁移到这个新的平台,并计划迁移基础架构的其他部分,最终进入生产。 到现在为止还挺好。

我希望你能说服足够多的人更好地看待它。 我承认,我花了一些时间去适应这个想法。 但一旦你得到它,这实际上是值得的。