加入docker管理员_Docker简介及其对系统管理员的重要性

加入docker管理员

自从Docker在2013年初上线以来,它就与程序员和系统管理员建立了一种讨厌的关系。 虽然我说过一些“经验丰富”的开发人员总体上对容器化非常不喜欢(稍后再介绍),但是有一个原因据报道,包括eBay,Twitter,Spotify和Lyft在内的许多主要公司都在其容器中采用了Docker生产环境。

那么Doc​​ker到底做什么?

是否曾与VMware,VirtualBox,Parallels或任何其他虚拟化软件一起使用? 好的,Docker几乎是相同的(尽管没有精美的GUI),它创建了一个虚拟机,其中包含您选择的操作系统,该操作系统仅与您的Web应用程序及其依赖项捆绑在一起。

但是虚拟机不是很慢吗?

虚拟化是推动云计算革命的动力,我喜欢将Docker称为虚拟化的最后一步,它实际上执行了您开发的业务逻辑。

但是,您的权利–典型的虚拟机运行缓慢,并且Docker所做的工作无法完全归类于虚拟化之下。 取而代之的是,Docker通过使用runc (由Open Containers Initiative维护) 在内核对不同进程名称空间,设备名称空间等的支持之上提供了一种抽象,它允许它共享许多主机系统的资源。 由于Docker容器和主机机器的内核之间没有附加的虚拟化层,因此容器可以为您的主机提供几乎相同的性能。

完全虚拟化的系统会为其分配自己的资源集,并进行最小程度的共享(如果有),从而导致更多的隔离,但是它却较重(需要更多的资源),但是,使用Docker时,隔离程度降低了,但容器却很漂亮轻量级(需要更少的资源)。

如果您需要在绝对需要保证资源的情况下完全隔离的系统(例如游戏服务器),那么基于KVM或OpenVZ的虚拟机可能是可行的方法。 但是,如果您只想将彼此独立的进程隔离开来,并在一堆大小合理的主机上运行它们,而又不花很多钱,那么Doc​​ker就适合您。

如果您想了解有关运行容器化系统的性能方面的更多信息,请阅读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 SwarmKubernetes )以及供应商管理的工具(例如AWS的Elastic Container ServiceGoogle Kubernetes Engine)提供了监视和管理容器集群和调度的自托管云编排工具,以解决这一难题

随着Docker的广泛使用以及与AWS和Google Cloud等云服务提供商的紧密集成,它Swift成为对您的新应用程序或现有应用程序进行Docker的明智之举。

翻译自: https://hackernoon.com/an-introduction-to-docker-and-how-it-is-important-for-sysadmins-9ai83awo

加入docker管理员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值