讨论转录:
[基思]大家好。你们今天过得怎么样?你们在纳帕玩得开心吗?
(观众)是的。
[基思]是的,好吧。我叫Keith Kreissl。我是cars.com的首席开发者。今天和我在一起的有兹拉特科·西西奇,麦克·海勒-奥格登和Deep Mistry。都是高级开发人员。在我们开始整个演讲之前,有几件事我们想要说清楚。第一,我们在cars.com上不卖车。我们也不收取销售在cars.com的百分比。最重要的是,我们买汽车没有折扣。如果这里有人想要这些,很遗憾,我不能给你。 But we hope you stay and enjoy the talk anyway.
那么我们在cars.com做什么呢?Cars.com是汽车购买者和车主的主要在线目的地。我们提供可信和易于理解的信息,以帮助消费者研究,定价和找到新车和二手车以及优质的服务和维修提供商。既然我已经完成了营销任务,让我们来谈谈技术专家在cars.com上做些什么。
让我们来看看其中的一些指标。我们是一家成立于1998年的公司,处理这些指标最明显的选择是使用典型的JDE堆栈。HTTP服务器,然后是应用服务器,然后是Java,当然,运行在任意Linux主机的输入名称上,然后它都与数据库通信。所以,随着时间的推移,正如你所看到的,我们实际上已经上升到了一些非常重要的数字。有了这些,我们必须加强我们的基础设施。这些都可以用这个漂亮的架构图来描述。
现在,我不指望任何人能读懂这个,尤其是坐在前面的人。所以,相信我的话就好了。你知道,我们有一个呈现层,一个复合层,一个服务层,然后是一个数据存储层。这么多年来,我们有很多——我们有很多建筑决策者来了又走。他们给我们留下了什么,他们给我们留下了两种风格的HTTP服务器,所以我们有IBM和Oracle。我们有两种类型的应用服务器。我们有WebLogic和WebSphere。我们有两种类型的Java运行时。也就是你的甲骨文和IBM。还有不同的版本。 Yes we are still running one-five cause we have an IBM portal. So if anybody wants to talk about that we can still do that. We also are using Java 7 and we’re looking at doing a little of Java 8. And then when you look at the OS we have Oracle Linux and we have Red Hat Linux, and I’m pretty sure some of our Linux engineering have some IBM AIX boxes running out there.
现在你可能会说,这对一个环境来说并不太可怕。但是我们有五种环境。我们有一个开发,一个未来测试,一个集成,一个性能测试和一个产品,所以把所有这些乘以5。好吧,还不错。那我们所有的应用程序呢?我们有大约10个web应用程序和大约100个服务,我们在任何给定的时间都在运行。真正发生的是,它变成了这样的东西。
所以任何时候你都会想,嘿,问题在哪里。我不知道,因为这是我们必须做的。因为我们必须管理所有的系统,所有的虚拟机。所以,我知道,你会说,嘿,基思,猜猜厨师们来了什么,你为什么不去和他们谈谈,他们有解决办法。是的,我们确实使用Chef。Chef帮了我们很大的忙,事实上,在采购我们所有的虚拟机方面,Chef帮了我们很大的忙。然而,我们必须谈谈那些让所有奇迹发生的人,对吧?这就是开发者。这是我们在这个房间里的每一个人;用笔记本电脑写所有的代码。 So now, as you can see, we have laptops which are running either NGINX or Apache. I have an app server that’s going to be either Jetty, Tomcat, Spring Boots, the new one. That’s what everyone’s loving. Then I have different versions of Java. Is it the Oracle? Is it the open JDK? And then let’s not talk about the OS that we’re running on, which is going to be either OSX or Windows.
所以你可以看到这个问题一直在复利。现在我已经成为我们开发团队的领导,我每天听到的最常见的事情是:嘿,在我的机器上工作,为什么它不能在X环境下工作?这让我感到非常沮丧,因为正如你所看到的,我想找出问题在哪里。
进入不可变基础设施。在cars.com,我们正在努力实现应用程序、运行时环境和操作系统的最终封装,这样我们就可以有最大的信心,我们在我们的机器或自动化机器上创建的工件将与在每个单独的环境中运行的工件和在生产中运行的工件是相同的。
我们希望实现一个可预测、可扩展并具有自动恢复功能的基础设施。我们真的很想推广同样的藏物。我不想决定哪一部分被改变了。我希望能够说,这个运行在这里,它将运行在那里。我还希望能够应对流量的增加,对吧?我不想去获取更多的虚拟机,我不想去运行所有的Chef命令和运行所有的东西。我希望它能成功。当然,如果灾难发生了怎么办?如果有些东西不工作怎么办?我希望能够高效地回滚。 So how am I going to do this, what’s gonna do it for me?
当然是Docker。对吧?它是万能的灵丹妙药。那么,为什么是Docker?它给了我们一个很好的状态隔离。我可以把我所有的组件放在一个图像中,并确保它在每个环境中都没问题。我不需要——我可以自动构建它。我可以自动部署。我移动这个工件,这个映像运行这个容器里面有一个应用,一个运行时,和一个操作系统。而且要确保如果其中任何一件发生了变化,也没什么大不了的,对吧? I just rebuild my image and then I can run it in a different environment. I have fast recovery. Right. If something goes wrong, let’s say a container starts going haywire or maybe I don’t like what’s happening in the container, then I just can spin up one — a previous one that was running.
对我们来说,真正重要的是蓝色/绿色和金丝雀版本。有了这个,我希望能够尝试新的功能。我想说,嘿,我想让10%的流量看到这个,剩下的90%看到另一个。我怎样才能有效地做到这一点?只需启动几个容器,将其添加到负载均衡器中,就可以了。
另外,我不知道你们是否有这个问题,但是如果你想改变你的技术,如果你想改变你的语言。如果你在Java中运行,你会想,嘿,我想知道Node是否可以工作。我们花了很多时间来研究这些发现,以确保它的性能和Java一样好。对吧?用这种方法,我们真的不需要这样做。你只需要旋转两个容器,把它们放在一起,然后看看哪个性能更好。有了这个,我就把那个坏掉的关掉了。
最后,它是热的。对吧?它性感。现在到处都是。每个人都想这么做。他们今天早上谈了这件事。我们刚刚参加了Riot Games的另一场演讲。他们也在这么做。这似乎是未来的趋势。
现在你知道了所有关于Docker的知识,它有多酷,它将如何帮助我们,我想下一件事是我们必须弄清楚我们的用例是什么。你知道,就像,我们怎么才能真正做到这一点。所以,我们决定看看我们的渲染引擎。我们的渲染引擎是典型的JDE应用程序。它在运行,很好,很有效。然后我们决定,让我们把这个放到Node中。不仅如此,让我们把运行时和环境都放在Docker容器中。这就是我们要做的。我们会取这个应用,我们会给它一个运行时,我们会把它放在Docker中。
但是当我们开始这样做的时候,我们开始意识到我们还有一些新的挑战。为了解释这些新的挑战以及我们是如何解决它们的,我想邀请Zlatko来给大家介绍更多的背景知识。
[Zlatko]好吧,Keith。感谢您为我们复杂的基础设施提供一些见解。好吧,我很确定我们不是唯一有这个问题的人。所以,至少,我们正在采取一些步骤来简化它,一次几个步骤,我的意思是,我们目前在这方面做得很好。
现在我们得到了什么?我们有一个用Node编写的新渲染引擎,我们希望对它进行Dockerize,并尽快将其部署到生产环境中。基本上我们是怎么开始的我们有一组开发人员他们在编写新的代码行。他们正在简化应用程序、重构、构建、创建新节点和NPM模块。所以他们必须把它——或者我们必须和Docker一起发货。
首先,我们从简单的官方Node映像开始。使用它们,将它们拉下来,添加要部署的应用程序,一切都运行得很好。但我们注意到的问题是在虚拟机上运行它。将这些图像从一个点移动到另一个点需要花费很多时间。从我们的存储库到一个新的虚拟机。从存储库到开发人员的机器。所以我们需要坐下来再看一遍,看看我们能否重构这些图像。如果我们还能创造一些别的东西,来简化一切,让它更快。不仅更快,我们还——我们正在考虑其他开发人员——开发团队。我的意思是,我们有JavaScript开发人员,Java开发人员,我们也有数据开发人员,他们想要发布他们的脚本-[…]脚本-将它们转移到生产中,所以有不同的团队,不同的需求,我们在寻找我们该走哪条路。 Do we provide runtimes and images for every one of those themes or do we really want to provide a base image that provides a certain set of utilities. So that any developer can take that image, pull it down and be familiar with the environment. That’s what we basically — that is the route that we wanted to take. So we evaluated to different major Linux distributions. They’re all kind of big in size but they all still work.
我们注意到我们的一些工具,它们都是非常基本的,我的意思是,从bash脚本到tar压缩等等。我们注意到,我们使用的每个发行版默认情况下都缺乏这些工具。所以不管我们用的是哪一种,我们仍然需要对它进行一些调整,使它能适应我们的环境和需求。所以最后,我们真的想要一些非常轻量级的东西,它非常实用,并且可以被所有团队重用。
因此,经过评估和一些poc,我们认为Alpine Linux是我们的最佳选择。因此,Alpine Linux提供了一些现成的实用程序。它很小。大约有5兆字节大小。您可以使用Alpine包管理器来安装APK存储库也提供的其他库。我们的基本图像大约有12兆字节。然后我们用它来安装额外的——分层额外的基本映像并创建不同的运行时。
现在我们有了一个Java运行时。我们有不同版本的Node运行时。我们有Tomcat实例。我们有不同的网络服务器,如果我们需要的话,以防万一。它们都非常非常,我是说,非常小。您可以看到其中的一些,比如Tomcat,它从357兆字节下降到181兆字节。然后在Node上有两种不同类型的映像,最新的和精简的。我的意思是,它从300兆变成了55兆。我们的整个图像和应用程序的大小约为80兆字节。
那么我们是如何做到的呢?我的意思是,我们采用了其他人都在使用的最佳做法。你可以在网上找到,这是整合命令,基本上把它们链接在一起。安装应用程序,从源代码安装二进制文件,删除这些二进制文件,清理所有临时文件。我们还做的一件事是增强这些映像的安全性我们降低了运行时的实际用户权限。所以我们不想以root身份运行它们。是的,很多人说,嘿,为什么不作为根运行它,它只是一个容器。有一些额外的特权可以在安全漏洞的情况下使用。所以,如果我们关闭它,我的意思是,如果我们降低特权,并以特定用户运行它,我们还必须确保这些用户可以执行运行时所以我们必须改变这些二进制文件的权限。我们还注意到,通过仔细地重新排列命令,尽可能地改变用户,然后提取二进制文件等等,我们能够进一步缩小这些图像的大小。
有了运行时,有了应用创建的实际图像,我们需要知道在哪里存储它们。我们有了应用程序,我们有了所有不同的Node模块,我们有了Docker映像。另一方面,我们有Java开发人员构建新的应用程序。Jar文件,var文件。我们也有一些静态文件。而且,我们的一些Linux管理员,我的意思是,正如Keith已经提到的,我们使用不同风格的Linux。每个人都使用不同的包管理器。所以我们想要巩固这一切。我们想弄清楚我们真正能用的是什么,而不是有五、六个不同的应用程序。维护他们。 Is there anything we can use as a single solution? And Artifactory came to the rescue. It really turned out to be a one-stop shop for us. It really provided everything that we need.
我们能够保存Docker映像。我们可以使用NPM仓库。Maven存储库。不同的是,它和Jenkins集成得很好。其中一个非常棒的特性是——真正很棒的特性是能够定义多个存储库并将它们组合起来。就像我们在这里所做的,就是为我们所有的工件创建本地存储库。无论是快照还是发布将其分离出来。我们还创建了远程存储库,缓存我们从互联网上获取的所有外部工件。然后有能力为这种类型的工件创建一个虚拟存储库。我们可以将本地和远程存储库组合或分层,以便我们可以配置,例如,我们的Java - Docker映像,或者本地Maven实例,或者Java,我的意思是Java环境。 All we have to do is point to Artifactory and let the Artifactory make the decision where the artifact is going to be written from.
除此之外,我们还利用元数据支持。我们标记图像,然后在构建过程中使用它,并利用REST API检索它们。有了这些基础-有了这些基本的方法现在我想请Mac告诉我们更多关于我们首先开发的一些自定义脚本。
[Mac]谢谢你Z解释我们是如何设置这些的。
有了这些上下文,我们面临的下一个大问题是我们将如何处理我们的一些构建和部署。我们有了所有这些人工制品,我们已经找到了存储它们的地方,我们已经优化了它们,这很好,现在我们到底要怎么使用它们。我认为这是每个人都在关注的问题。现在有很多解决方案。但它们都处于发展的早期阶段。这就是我们面对的问题,当我们看到这个场景时,你可以在这些网站上看到,在主页上有免责声明,比如,Docker的论坛有一个声明,就像最初的开发还没有解决。比如,期待巨大的变化。对吧?每个解都只解决了问题的一部分。
我们真正需要的是能够满足我们即时需求的东西,而不是将我们锁定在一个特定的工具中。能给我们争取点时间的东西。对吧?一些非常简单的东西。因为我们没有很多需求来推出这个初始的Node应用程序。我们有一个应用程序,我们想要容器化,向组织证明我们可以做到这一点。对吧?我们需要做什么?我们需要能够处理一些扩展需求,使用端口做一些动态的事情,我们需要能够处理滚动部署。作为开始,这大概就足够了。 Also, we’re really trying to achieve immutable infrastructure so it’s all well and good that containers can, you know, encapsulate application state but we really want immutability in the thing that’s handling the builds and handling the deployments too. Like, at least to some degree we want that to be the same thing running on local developer machines that’s also running on the machines that handle the builds and handle the deployments. All right.
最后,如果我们能有一个提供非常简单的声明性语法的工具,那就太好了。我可以与应用程序源一起存储的一些配置文件与工件一起构建,因此所有构建逻辑或运行时逻辑实际上都与映像一起发布。
所有这些东西都很好,所以我想,什么样的工具可以帮助我满足这些基本需求。我回想过去,我碰巧记得有一个小工具,最初的构建工具,叫做Make。我环顾四周,你知道吗,这应该是一个Make文件。每个人都知道。现在这样就够了。我们现在需要填补空缺,而梅克就是那个人。
所以,你知道,我只是坐了几个小时,写了一个Make文件。我不指望你们能读懂所有的东西。我不得不把它缩小到四点字体。这实际上是一个旧版本。信不信由你,它现在大约是以前的两倍大。这是我们要解决的问题。但是看着这个Make文件,我在想,你知道,我希望这个在我的本地开发人员的机器上,我希望这个在将要处理构建和部署的机器上。我要这个到处都是。但是把它分发到所有地方,这肯定是个问题。它太大了,你会漂移的。 And it’s — that’s the opposite of mutability, right.
所以我们找到了一种方法把它包裹在一个简单的入口点里并且把它分布得更干净一些。现在在应用程序源代码中的文件,看起来更像这样。这是一个很简单的例子,但是它给了我们我刚才说的那种声明式的结构。这看起来很简单。它只有一个名字。那是我们在注册表参数上设置的工件存储库。一些端口绑定。对于端口绑定,它有自己的语法。如果你使用Docker运行端口绑定,它可能看起来不熟悉,但是一些环境变量,一些卷。我们实际使用的渲染引擎稍微复杂一点,但不是很多。 It’s pretty basic, right.
这个文件叫做动力总成。Mk文件,它位于项目根目录。
所以我将给你一个非常非常高的层次,看看这个工具上实际的CLI是什么样子的。它会给你一些我们将要做的演示的背景。这里有一个动力系统构建命令。现在,这个命令,连同其他命令,我将向您展示,您将注意到您不会指定任何标志或任何关于您正在运行的内容的信息,因为这些都在配置中。这就是问题的关键动力系统构建只是一个构建但这些参数将从配置文件中填写。
有一个动力系统发布命令,它会继续用文件中的信息标记你的图像,然后它也会把它推送到注册表中。
最后是deploy命令,它将做一些事情。这是一个复合任务,它将进入Docker主机并删除任何退出的容器,以确保我们能够像Docker swarm一样,以我们想要的方式分配端口。它会拉下那个映像因为你假设你在不同的盒子上构建映像而不是部署它。因此需要从注册表中提取图像。它会运行那个图像。然后它会去停掉之前的容器。还可以在命令行上参数化需要多少实例。如果你想的话,运行时还有很多其他的选项。现在你已经对这个临时工具有了一些了解,这是我们为构建和部署创建的双关语,我将邀请Deep Mistry来谈谈我们的CI/CD管道以及我们如何在Jenkins中使用它。
[深]好吧。所以,感谢Mac为我们介绍了如何构建和部署我们拥有的这些新应用。
那么让我来告诉你我们将如何将其部署到生产环境中。
谈谈CI/CD,我们使用的一些工具。因此,当涉及到CI/CD时,我们显然使用了常用的方法。我们使用Jenkins作为我们的CI服务器,我们使用Bitbucket作为我们的源代码控制,我们使用Artifactory,正如你之前听到Z提到的,它是我们所有注册表需求的一站式商店,所以我们使用Docker注册表,我们使用Alpine APK,以及我们所有的Maven和Gradle工件,对吧?我们也在CI/CD中使用Docker,不仅仅是为了运行我们的应用程序容器,我们还使用Docker容器在CI/CD管道中进行无限的测试。你在上面看不到的是大厨。我们用Chef来[…]干掉我们的Jenkins奴隶。Docker也可以自己托管。
所以,谈到持续集成工作流,对吧。通常,开发者会对代码库做一个改变他们会提交代码,然后把它推送到我们的源代码控制。一旦代码被推送到Bitbucket,它会触发Jenkins的网箍,然后会启动一个构建工作。现在,构建工作要做的是从Bitbucket中拉下repo,正如Mac之前在幻灯片中展示的,源代码不-显然它控制源代码-它也有Docker文件以及我们的动力系统配置文件,对吧。所以现在Jenkins将在CI服务器上使用相同的动力系统构建命令。正如你所看到的,它可以进行动力系统构建,这将构建Docker映像。
使用powertrain,您还可以覆盖您在配置文件中指定的一些变量。在这种情况下,在CI服务器上,我们实际上使用了一个版本变量,这只是想给它一个不同于源文件中的版本。这样我们就可以在Artifactory中跟踪那个版本。所以我们使用类似于Jenkins的构建号和触发这个提交的git散列的组合。这触发了这次构建。Jenkins构建了这个映像,对吧,一旦映像构建好了,它就会启动实际的容器。应用程序容器。它是一个web应用它会启动那个web应用到Docker主机上然后它也会启动一个测试容器。对该应用程序运行一些自动化测试,以确保一切正常。我们所做的改变并没有破坏一些核心功能。 So once this test it completes, and if it’s successful, we go ahead and push this image onto the Artifactory, right.
现在,这也是一条管道。一旦构建完成,它将触发我们的部署作业到我们的一个环境中,默认情况下,我们将每次提交部署到我们的开发环境中。所以部署任务基本上,它所做的是,实际上,我们在Jenkins中使用的是我们将所有的Docker主机配置到Jenkins主服务器上,作为SSH从服务器。因此,部署任务所做的就是SSH到我们的Docker主机上,并在Docker主机上运行您可以在本地笔记本电脑上运行的相同的动力总成脚本。
所以,正如你所看到的,它可以使用与构建号相同的版本进行动力系统部署,只需构建图像。对吧?我们现在可以用动力系统做的一件很酷的事情是,我们可以从图像本身,从构建图像中提取配置。对吧?所以请记住,当Jenkins构建映像时,它拉下了repo,所以我已经知道我的动力系统配置是什么样子以及我的动力系统文件是什么。但是在Docker主机上,我们没有任何源代码,对吧?我们只有图像。所以我们能做的就是使用powertrain的extract config命令,它会提取我们为环境中powertrain存储的所有配置文件。然后你可以提供你想运行的配置文件或者你想用哪个配置启动你的容器。对吧? So this is pretty powerful. With this, what it can do is you can pretty much run your container in any run configuration from whatever you want to, right. You can do this from your local environment and you can do this on multiple environments, right.
这就是我们在各种环境中部署的方式。就像Keith之前提到的,如果我们有五个不同的环境,那么这就是我们在跨环境移动时实现应用程序不变性的方式。
我们将尝试向你们展示,管道是什么样子的。我们要-麦克会帮我展示一点点。
[Mac]所以我要在这个仓库上做一个提交,以便开始构建。这是实际的主回购。我要在自述文件中添加一行,然后提交。我们所有的星球……当然,我们所有的开发人员都必须有一个[…]ID。所以我想我也得把它写进去。
[深]好的,那么这个push应该继续,启动我们的一个构建工作。
[麦克]这是推力,现在我们可以继续[…]。到我们的浏览器这里,我在管道页面进行渲染,我们会刷新。把它拿走。
[深]所以,是的,它实际上是在执行你刚才在幻灯片中看到的相同的动力系统命令。它正在构建应用程序映像。需要注意的一点是,当我们实际构建图像时。熟悉Docker的人,我们实际上是在构建应用程序并在Docker文件中运行应用程序的单元测试。我的意思是,正如Docker文件中的Docker指令。因此,作为Docker构建过程的一部分,我们实际上是在构建应用程序并进行单元测试。我们这样做的原因是我们想要确保应用程序是在最终要运行的环境中构建和测试的。这是同一个映像,它将在Docker主机上的容器中运行,所以我们应该在同一个映像上构建和测试。这就是它现在所做的。
在构建这些的时候,我们可以看一下Artifactory中的Docker注册表。哦。正如我们之前提到的我们有一些我们之前创建的基本图像。我们所有的应用程序图像都可以在Artifactory中找到。这是稍微慢一点的WiFi。所以。好了。我们——我们——几乎存储了每个提交加载,所以正如你在CI工作流中看到的那样,每个提交都被构建到Docker映像中。我们可以回到,我们可以去看Bitbucket服务器,去看提交历史看看哪个提交,哪个build与那个提交相关联。如果你想回滚,你可以快速到Artifactory拉下那个图像并部署它。
我们之前使用过的Artifactory的一个很酷的功能是Docker info选项卡。因此,当我们开始构建应用程序时,我们从Ubuntu或Debian等可用的基础软件包开始。而且它们的体型明显要大一些。我们可以看到在Artifactory中,每一层都可以看到每一层占用了多少空间。这对我们解决问题很有帮助,我们可以改进Docker文件,减少一些基本图像的大小。
因此,正如前面提到的Z所示,应用程序映像只有88兆字节。之前使用不同的基本图像时,它几乎是500兆字节。由于每次提交都要创建一个图像并发布,因此进一步减小大小会很有帮助。是的,我们可以从Artifactory中使用一个非常好的工具。
那么我们回到管道。希望这个构建现在已经完成了。
(Mac)
[深度]你只需要刷新它。哦,它还在运行。之所以要花很多时间是因为正如我之前提到的,它还需要做一些测试。用它进行自动测试。它在旋转测试容器并运行针对它的所有自动测试。很明显,这将触发部署到开发环境,所以每次构建都会自动触发部署到开发环境。从那时起,如果你想部署到未来的测试环境中,我们有一个按钮部署规则,qa必须继续进行测试,如果他们想测试一个特定的构建,只需点击那里的按钮就可以将该构建移动到[…]环境中。
麦克:詹金斯的任务可能已经备份了。我们有7万……
(深)。
(Mac)
(深)是的。希望。所以- - -
[麦克]你要我按那个按钮吗?
[深]你可以按一下,没关系。
基本上这个想法就像你构建你的应用程序映像,无论你是在本地系统上还是在CI服务器上构建它。你应该能够将图像移动到任何你想要的环境中,有了动力系统,你就能做到这一点。因为你可以用不同的配置来运行这个容器。所以也许dev可能需要一些其他的服务依赖关系或其他数据库依赖关系,所以你不应该仅仅因为你想要不同的环境依赖关系而改变应用程序。所以,是的。我想总结一下,这就是我们在应用程序中实现不变性的方式。然后……
(Mac)
[深]你只想,你想看看构建队列。好像我不知道它有多大。好了。
[Mac]哦,是的,构建队列备份了。
(深)是的。
是的。正如Mac提到的,一直都有开发者提交,所以这是我们关注的一件事:比如缩放Jenkins本身。我们现在只有一个大师。我们正在研究,像使用多个主机和集群。
最后,我想邀请Keith回来谈谈cars.com的Docker的未来以及我们要如何推进它。
[Keith]是的,看起来我们要把电子邮件放在CI/CD管道中,这样开发人员在做演示时就不会碰它了。
好吧,不管怎样。所以现在你看到我们有了这个全新的工具,我们有了不可变基础设施的伟大概念,当然还有Docker以及学习和扩展它的渴望。我们正在采取更小的步骤。我们真的在尝试迭代这个过程。在这个领域,很多事情都在发生变化,我们只是想确保在我们跳上下一个技术之前,看看那里有什么。然而,当我们发现我们需要某个新功能时,我们就会把它添加回整个CI/CD管道中。
好吧,让我们在cars.com上谈谈Docker的未来。当我开始这个演讲时,我说我们有10个web应用和大约100个服务都是用Java编写的。我们当然希望能够将所有这些迁移到Docker容器中,并建立一个完整的Docker生态系统,让我们所有的应用程序相互通信。
但我想更进一步。我真的很想把这个想法,你知道,容器里面运行的东西不应该是重要的,对吧?如果你有这样的想法,你的容器可以接受一个web请求,然后做出相应的响应,那么不管在那里有什么。我想放什么就放什么。这为解决任何问题提供了更多的工具。也许你想用Node。也许你想用Scala。也许[…]是你选择的语言。你应该被允许使用这些,而不是被你现有的基础设施所限制。如果您以这种观点开始构建容器和映像,那么您应该可以毫无问题地旋转一些东西,将其拆开并尝试新的东西。 Which is real exciting for all of us, especially as technologists, to see where this can take us.
所以到最后,我们得出结论,你知道,我们真的感谢大家在这里听我们,希望你们学到的知识,或者,你知道,采取了一些东西远离我们所做的或如果您有任何指针对我们我们很想听到,所以从这个角度我想打开的问题,我可以把每个人都在这里,然后我们就可以把它从那里。
