加入docker管理员
自从Docker在2013年初上线以来,它就与程序员和系统管理员建立了一种讨厌的关系。 虽然我说过一些“经验丰富”的开发人员总体上对容器化非常不喜欢(稍后再介绍),但是有一个原因据报道,包括eBay,Twitter,Spotify和Lyft在内的许多主要公司都在其容器中采用了Docker生产环境。
那么Docker到底做什么?
是否曾与VMware,VirtualBox,Parallels或任何其他虚拟化软件一起使用? 好的,Docker几乎是相同的(尽管没有精美的GUI),它创建了一个虚拟机,其中包含您选择的操作系统,该操作系统仅与您的Web应用程序及其依赖项捆绑在一起。
但是虚拟机不是很慢吗?
虚拟化是推动云计算革命的动力,我喜欢将Docker称为虚拟化的最后一步,它实际上执行了您开发的业务逻辑。
但是,您的权利–典型的虚拟机运行缓慢,并且Docker所做的工作无法完全归类于虚拟化之下。 取而代之的是,Docker通过使用runc (由Open Containers Initiative维护) 在内核对不同进程名称空间,设备名称空间等的支持之上提供了一种抽象,它允许它共享许多主机系统的资源。 由于Docker容器和主机机器的内核之间没有附加的虚拟化层,因此容器可以为您的主机提供几乎相同的性能。
完全虚拟化的系统会为其分配自己的资源集,并进行最小程度的共享(如果有),从而导致更多的隔离,但是它却较重(需要更多的资源),但是,使用Docker时,隔离程度降低了,但容器却很漂亮轻量级(需要更少的资源)。
如果您需要在绝对需要保证资源的情况下完全隔离的系统(例如游戏服务器),那么基于KVM或OpenVZ的虚拟机可能是可行的方法。 但是,如果您只想将彼此独立的进程隔离开来,并在一堆大小合理的主机上运行它们,而又不花很多钱,那么Docker就适合您。
如果您想了解有关运行容器化系统的性能方面的更多信息,请阅读IBM的一篇出色的研究论文: 《虚拟机和Linux容器的更新性能比较》 (2014年,Felter等人), 对虚拟机和Linux容器进行了合理的比较。容器。
我不能直接将应用程序直接上传到一堆云服务器上吗?
如果您不关心基础结构,环境一致性,可伸缩性或可用性之类的内容,那么可以。
想象一下以下情况:您可以管理十二个Java服务,并将它们部署在运行带有Java 8的Ubuntu的单独服务器上,以用于开发,质量保证,登台和生产环境。 即使您没有使应用程序高度可用,也需要管理至少48台服务器(12个服务x 4个环境)。
现在,假设您的团队带头组织了一项变更政策,要求您将运行时升级到Java11。这是您需要登录和手动更新的48台服务器。 即使使用Chef或Puppet之类的工具,也需要大量工作。
这是一个更简单的解决方案
Docker使您可以创建所需操作系统的快照,并仅在其上安装所需的依赖项。 我喜欢这样做的一方面是,您可以管理所有“过时软件”,也可以对其进行管理。 您可以使用最少的Linux安装(我建议使用Alpine Linux ,尽管出于本文的目的,我将继续使用Ubuntu),并且仅在其上安装Java 8。
更新时间到了,只需编辑Java映像的Dockerfile以使用Java 11,构建并推送到容器存储库(如Docker Hub或Amazon ECR),然后您要做的就是更改应用程序容器base-image标签引用新快照并重新部署它们。
这是在Ubuntu 18.04最小操作系统之上构建的示例Docker容器的要点 。
我将建立与这一形象推到多克尔中心帐户damian
使用标签oracle-jdk-ubuntu-18.04:1.8.0_191
,然后用它来建立另一个容器为我服务上运行:
# Instructs Docker to build this container on top of this snapshot
FROM damian/oracle-jdk-ubuntu- 18.04 : 1.8 . 0 _191
# Copys the application JAR to the container
COPY build/hello-world.jar hello-world.jar
# Executes this command when the container starts
CMD java -jar hello-world.jar
现在,如果我需要将服务更新为Java 11,我所要做的就是发布安装了兼容JRE的Java快照的新版本,并更新服务容器中FROM
声明中的标记,指示容器使用新的基本映像。 Voila,在您的下一次部署中,您将拥有来自Ubuntu和Java的最新更新的所有服务。
但是,这将在开发期间对我有什么帮助?
好问题。
我最近开始在单元测试中使用Docker。 想象一下,您有成千上万的测试用例(如果您相信,相信我,我会感到很痛苦),它们连接到数据库,其中每个测试类都需要数据库的新副本,并且各个测试用例将对数据库执行CRUD操作。数据。
通常,在每次测试后,都需要使用Redgate的Flyway之类的工具来重置数据库,但这意味着您的测试必须按顺序运行,并且会花费很多时间(我发现单元测试套件可能要花费20分钟才能完成因此完成)。
使用Docker,您可以轻松地创建数据库的映像(我建议使用TestContainers ),在容器中为每个测试类运行一个数据库实例,然后并行运行整个测试套件。 由于所有测试类都是并行运行的,并且链接到单独的数据库,因此它们都可以同时在同一主机上运行,并在一瞬间完成(假设您的CPU可以处理)。
我发现自己使用Docker的另一个地方是在Golang中进行编码(其配置和依赖关系管理很混乱),而不是直接在我的开发机器上安装Go,而是遵循与Konstantin Darutkin相似的方法,通过与我一起维护Dockerfile去安装+依赖项配置为当我对源文件进行更改时实时重新加载我的项目。
这样,既然我已经控制了项目并控制了Dockerfile的版本,并且如果我需要更改开发计算机或对其进行重新格式化,那么我所要做的就是简单地重新安装Docker以从上次退出的地方继续。
总结一下…
如果您是一家初创公司,但不确定要如何为新技术堆栈提供动力,或者您是一家既定的服务提供商,正在考虑将Prod和NonProd环境进行集装箱化,但又担心在“未经检验”的水域(假笑)航行,请考虑一下。
一致性
您可能拥有整个行业中最优秀的开发人员,但是由于所有不同的操作系统无处不在,因此每个人都喜欢自己的设置。 如果您已经使用Docker正确配置了本地环境,那么新开发人员所需要做的就是安装它,并随应用程序生成一个容器并启动。
调试
您可以轻松地隔离并消除整个团队环境中的问题,而无需了解他们的计算机设置方式。 一个很好的例子是,我们曾经不得不通过从ntpd迁移到Chrony来解决服务器上的一些时间同步问题,而我们所做的只是更新基本映像,而我们的开发人员则不那么明智。
自动化
现在,大多数JCI / CD工具(包括Jenkins,CircleCI,TravisCI等)都已与Docker完全集成,这使在不同环境之间传播更改变得轻而易举。
云端支援
需要监视和控制容器,否则您将不知道服务器和DataDog上正在运行什么,这是一个云监视公司在Docker上的说法:
容器的使用寿命短和密度增加对基础架构监视具有重要意义。 它们代表需要单独监视的事物数量的数量级增加。
自我管理的云编排工具(例如Docker Swarm和Kubernetes )以及供应商管理的工具(例如AWS的Elastic Container Service和Google Kubernetes Engine)提供了监视和管理容器集群和调度的自托管云编排工具,以解决这一难题 。
随着Docker的广泛使用以及与AWS和Google Cloud等云服务提供商的紧密集成,它Swift成为对您的新应用程序或现有应用程序进行Docker的明智之举。
翻译自: https://hackernoon.com/an-introduction-to-docker-and-how-it-is-important-for-sysadmins-9ai83awo
加入docker管理员