`
熊likecocoa
  • 浏览: 18612 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java程序员需要注意的五大Docker误区

阅读更多
Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Docker的优势和问题。

抛去那些媒体和厂商们的炒作,我们如何才能更好更理性的使用Docker?



Docker最近备受关注,原因显而易见。如何成功交付代码一直困扰着大家。传统的容器技术在众多需求和模板中乱成一团。而Docker可以简单且 重复的创建容器。相比其它容器,使用Docker可以更快、更自然的交付代码。Duang,Docker火了!随之而来也有一些误解和误区。不要太相信别 人说Docker好用或者不好用。自己理性地全面思考一下Docker,会帮助你真正理解是否真的需要它。

本文列举了从Java角度的五大Docker误读。不过首先介绍些背景知识。为了更好地理解Docker,我们咨询了Fewbytes的Avishai Ish-Shalom,他有丰富的Docker经验,也是DevOps Days会议的组织者。我们和他一起列举出了这些误解。

主要误区

1. Docker是轻量级虚拟机

这是大家初学Docker时最主要的误解。这种误解倒也情有可原,Docker的确看上去有点像虚拟机。Docker网站上甚至有人比较了Docker和虚拟机的区别。但是,Docker实际上不是轻量级虚拟机,而是改进了的Linux容器(LXC)。Docker和虚拟机是完全不一样的,如果你把Docker容器当成轻量级虚拟机来用,会遇到很多问题。

在使用Docker之前,必须了解Docker容器和虚拟机有很多本质的区别。

资源隔离:Docker达不到虚拟机所能提供的资源隔离水平。虚拟机的资源是高度隔离的,而Docker从设计之初就需要共享一些资源,这些资源是Docker无法隔离和保护的,比如页缓存和内核熵池。(注:内核熵池很有趣,它收集并且存储系统操作生成的随机比特。机器在需要随机化时会使用这个池,比如密码相关。)如果Docker容器占用了这些共享资源,那么其它进程在这些资源被释放前只能等待。

开销:大多数人都知道虚拟机的CPU和RAM能提供类似物理机的性能,但是有很多额外的IO开销。因为放弃了虚拟机的guest OS,Docker的package更小,比起虚拟机需要更少的存储开销。但这并不意味着Docker没有任何开销问题。Docker容器依然需要注意 IO开销的问题,只不过没有虚拟机严重而已。

内核使用:Docker容器和虚拟机在内核使用上完全不同。每个虚拟机使用一个内核。Docker容器则是在所有容器间共享内核。共享内核带来一些 效率的提升,但是以高可用和冗余为代价。如果虚拟机发生了内核崩溃,只有这个内核上的虚拟机会受影响。而Docker容器如果内核崩溃了,所有的容器都会 受影响。

2. Docker使得应用可扩展

因为Docker可以在很短的时间内在多个服务器上部署代码,自然有人会觉得Docker可以让应用自身变得可扩展。不幸的是,这是错误的。代码是 应用的基石,而Docker并不会重写代码。应用的可扩展性依然取决于程序员。使用Docker并不会自动得让你的代码易于扩展,只是让这些代码更容易跨 服务器部署而已。

3. Docker在生产环境广为使用

因为Docker势头正劲,很多人便认为Docker可以在生产环境上大规模使用。事实上,这是不对的。注意Docker还是很新的技术,还不成 熟,正在成长,这意味着还有很多烦人的bug和待完善的功能。对新技术感兴趣这没错,但是最好要弄清楚新技术的正确使用场景和需要注意的地方。现 在,Docker很容易应用到开发环境。使用Docker可以很容易地搭建出很多不同的环境(至少,给人的感觉是能够搭建出不同的环境),这对于开发很有 用。

而在生产环境中,Docker的不成熟和不完善也限制了使用场景。比如,Docker不直接支持对多机器的网络和资源的监控,这使得它几乎无法在生 产环境中使用。当然也有很多有潜力的地方,比如可以将同一个package从开发环境直接部署到生产环境。还有一些Docker运行时特性对于生产环境也 很有用。但是总的来说,在生产环境里,目前不足多于优势。这并不是说无法成功运用到生产环境,只是现在还不能指望它一下子成熟和完美。

4. Docker是跨OS的

另一个误解是Docker在任意操作系统和环境上都可以工作。这可能来自于装卸货物的集装箱的类比,但是软件和操作系统的关系可不像船位那么简单直接。

实际上,Docker只是Linux上的技术。并且Docker依赖特定的内核特性,必须要有最新版本的内核才行。基于不同OS的差异性,跨OS 时,如果使用的不是最底层通用的特性,会遇到很多麻烦的问题。这些问题可能只有1%的发生率,但是当你在多台服务器上部署时,1%也是致命的。

虽然Docker只在Linux上运行,但是也可以在OS X或者Windows上使用Docker。使用boot2docker会在OS X或Windows机器上运行一个Linux虚拟机,这样Docker可以在这个虚拟机里运行。

5. Docker增强应用的安全性

觉得Docker可以改进代码和交付代码过程的安全性,这也是误解。这也是真实的集装箱和软件上容器的差别。Docker是一种容器化技术,添加了 编排方法。但是Linux的容器有一些安全漏洞可能会被攻击。Docker并没有为这些漏洞添加任何安全层或者补丁。它还不是能保护应用的铁布衫。

从Java角度看

一些Java开发人员已经开始使用Docker。Docker的某些特性让我们更容易构建可扩展的上下文环境。不像uber-jar,Docker 可以帮助你将所有的依赖(包括JVM)打包到一个随时可发布的镜像中。这也是Docker对于开发人员来说最迷人的地方。但是,这也会带来一些隐患。一般 来说,程序员需要用不同的方式和代码交互 – 监控它,调试它,连接它,调优它….如果使用Docker,这些都会需要额外的工作。

比如,我们想使用jconsole,它依赖于JMX功能,JMX因为要使用RMI又需要网络。使用Docker的话就不是很直接,需要一些技巧去开 启所需端口。我们最初发现这个问题是当我们想要构建Takipi的Docker应用,我们不得不在容器里JVM之外运行了一个后台程序。详细的解决方案在 GitHub上。

另外一个很严重的问题是Docker容器的性能调优相当困难。当使用容器时,你不知道每个容器到底会分配多少内存。如果你有20个容器,内存会以你 不确定的方式分配给它们。如果你打算用参数-Xmx调优堆的大小,就很困难,因为对Docker容器内JVM的处理取决于能够自动得到该容器分配到的内存 大小。如果都不知道分配了多少内存,性能调优几乎不可能。

结论

Docker是很有意思的技术,有一些真实有效的使用场景。作为一个新兴技术,还需要大量时间来解决缺失的功能和已知的bug。但是,现在这个领域的确有很多的炒作。不过记住哦,炒作可不是成功~(来源:dockone)



分享到:
评论

相关推荐

    Java程序员需要的电子书

    9. **《Docker深度实践》**:虽然不是直接关于Java的,但Docker作为现代软件开发的重要工具,理解其工作原理和使用方法对Java程序员很有帮助。 10. **《微服务架构设计模式》**:讲解了如何设计和实施微服务架构,...

    黑马程序员Docker入门笔记

    黑马Docker课程文档笔记

    java8 的docker镜像,支持私网部署

    java8 的docker镜像,支持私网部署

    java程序员c程序员简历模板

    【Java程序员与C程序员简历模板】是为求职者量身定制的专业简历样本,旨在帮助这两个领域的专业人士更好地展示自己的技能和经验。在准备求职时,一份精心设计、内容详实的简历至关重要,它不仅反映了个人的专业素养...

    gdal+java8环境的docker镜像

    ubuntu系统gdal+java8环境的docker镜像,通过docker load命令导入。

    Java程序员面试简历模板2022

    【Java程序员面试简历模板2022】是一个专门为Java开发者设计的面试简历模版,旨在帮助求职者在2022年的招聘季中脱颖而出。在准备面试时,一份精心制作的简历至关重要,它不仅是个人能力的展示,更是面试官了解候选人...

    java程序员上班那点事儿

    随着技术的不断发展,如Java新版本的发布、容器化技术Docker、云原生应用的崛起,以及大数据和人工智能领域的进步,Java程序员需要时刻保持敏锐的洞察力,不断学习和更新自己的技能库。 总的来说,“Java程序员上班...

    6个Java程序员的年度总结-精

    标题中的“6个Java程序员的年度总结-精”意味着这是一份包含六个Java程序员在过去一年中关于编程工作、学习和成长的总结性文档。这些程序员可能是来自不同背景、经验水平和项目领域的专家,他们分享了他们的知识、...

    Java 程序员眼中的 Linux.zip

    《Java程序员眼中的Linux》是一本专为Java开发者量身打造的Linux教程,旨在帮助Java程序员更好地理解和利用Linux操作系统来优化他们的开发环境和提升工作效率。作为开源项目,它提供了丰富的学习资源,允许用户深入...

    台湾JAVA程序员经验讲解

    在项目开发过程中,Java程序员不仅需要编写高效、可维护的代码,还要懂得如何使用设计模式来解决复杂问题。例如,单例模式、工厂模式和观察者模式等,在实际工程中有着广泛的应用。同时,良好的编程习惯,如遵循...

    linux环境下基于Docker部署的java项目的实施方案

    步骤包括:选择合适的基础镜像、准备Java应用程序、配置Dockerfile、构建Docker镜像、运行Docker容器、访问Docker容器中的Java应用程序、发布Docker镜像。最佳实践包括:使用最小化的基础镜像、分离JRE和应用程序、...

    【黑马程序员】SpringBoot应用Docker化.docx

    【黑马程序员】SpringBoot应用Docker化.docx【黑马程序员】SpringBoot应用Docker化.docx【黑马程序员】SpringBoot应用Docker化.docx【黑马程序员】SpringBoot应用Docker化.docx【黑马程序员】SpringBoot应用Docker化...

    java, Java Dockerfile用于可信的自动 Docker 构建.zip

    java, Java Dockerfile用于可信的自动 Docker 构建 Java Dockerfile这个库包含 Dockerfile 用于 Docker 自动构建( 发布到 public Docker-Hub 注册表。基本 Docker 映像dockerfile/ubuntu Docker 标

    Java 程序员眼中的 Linux

    综上所述,Java程序员对Linux的理解和熟练使用,不仅能提升开发效率,还能更好地管理和优化Java应用的运行环境,从而在复杂的企业级项目中发挥更大的作用。通过深入学习和实践,Java程序员可以在Linux世界中游刃有余...

    drp项目 开发 Java程序员

    Java程序员需要熟悉SQL映射文件的编写,以及动态SQL的使用,以实现数据的CRUD操作。 4. **JPA与Hibernate**:JPA是Java的ORM(对象关系映射)标准,而Hibernate是其流行的实现。了解实体管理、查询API,以及事务...

    docker部署Java项目流程

    Docker 部署 Java 项目流程 Docker 是一个开源的应用容器引擎,基于 Go 语言开发并遵从 Apache2.0 协议开源。使用 Docker 可以让开发者封装他们的应用以及依赖包到一个可移植的容器中,然后发布到任意的 Linux 机器...

    Java程序员就业面试大全

    总之,Java程序员在面试中需要展现出深厚的技术功底、清晰的思维逻辑以及良好的沟通能力,这样才能在竞争激烈的就业市场中脱颖而出。同时,不断学习和适应新技术,以保持竞争力,是每个Java程序员职业生涯中的必修课...

    Java 程序员 职场全攻略

    Java程序员在职场中不仅需要扎实的技术基础,还需要具备良好的职业素养和不断学习的能力。本资料集《Java程序员职场全攻略》旨在为Java开发者提供全面的职场指南,涵盖技术提升、项目管理、团队协作、沟通技巧等多个...

    【大厂面试专栏】一份Java程序员需要的技术指南,这里有面试题、系统架构、职场锦囊、主流中间件等,让你成为更牛的自己!.zip

    这份名为"【大厂面试专栏】一份Java程序员需要的技术指南,这里有面试题、系统架构、职场锦囊、主流中间件等,让你成为更牛的自己的.zip"的压缩包,显然是为准备Java程序员在大公司面试时提供的重要资源。...

Global site tag (gtag.js) - Google Analytics