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

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

主要误区:

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。记住! 炒作并不就代表成功了哦。

Java程序员需要注意的五大Docker误区相关推荐

  1. Java程序员面试失败的五大原因!

    下面是 Java 程序员面试失败最有可能的5大原因,当然也许这5点原因适用于所有的程序员,所以,如果你是程序员,请认真阅读以下内容. 看点 01 说得太少 尤其是那些开放式的问题,如"请介绍 ...

  2. Java程序员最喜欢的五大神器

    程序员留给大家的印象,不修边幅,沉默寡言.但程序员对于自己使用的神器,相当舍得花钱.今天咱们梳理下程序员最喜欢五大神器. 分享之前我推荐下我自己建的Java学习群:Java进阶群:766529531, ...

  3. 为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?

    作者:纯洁的微笑(真名:张强),高级 Java 工程师.架构师,GitChat 畅销课程作者.曾从零参与公司技术平台建设,组织平台进行过四次大架构升级.目前在一家第三方支付公司做技术总监,负责微服务架 ...

  4. 2019年Java程序员的学习路线

    2019年Java程序员的学习路线 一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kot ...

  5. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  6. Java程序员技术培训需要培训哪些?

    随着java技术行业的不断发展,越来越多的人想要学习java技术,那么想要成为一名优秀的java工程师,需要学习的技术知识是非常多的,下面小编就为大家详细的介绍一下Java程序员技术培训需要培训哪些? ...

  7. 身为 Java 程序员必须掌握的 10 款开源工具!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:雨轩小晴 www.seoxiehui.cn/article- ...

  8. Java 程序员必须掌握的 10 款开源工具!

    来源:http://t.cn/Ai9la34A 本文主要介绍Java程序员应该在2020年学习的一些基本和高级工具.如果你是一位经验丰富的Java开发人员,你可能对这些工具很熟悉,但如果不是,现在就是 ...

  9. 我现在是个普通Java程序员,如何才能“更有竞争力”?

    很多人会问我:我现在是个普通Java程序员,如何才能"更有竞争力"? 画外音:Java,是目前世界上最流行的语言. 我认为所谓竞争力,其实包括两个方面,现在的和未来的:搞得定当下的 ...

最新文章

  1. Pytorch 训练与测试时爆显存(cuda out of memory)的终极解决方案,使用cpu(勿喷)
  2. 使用PostSharp开始AOP
  3. 微信JSSDK javascript 开发 代码片段,仅供参考
  4. buu [BJDCTF 2nd]燕言燕语-y1ng
  5. Python学习笔记(基础知识点二)开更了~
  6. java中用jdom 如何创建xml文档/将数据写入XML中
  7. 无内鬼,来点ICML/ACL审稿人笑话
  8. pdo oracle返回参数游标,PDOStatement::closeCursor
  9. ios开发ocr识别_传统图像处理技术,ocr识别技术算法
  10. Linux安装中遇到如下错误提示:"cannot find appropriate C++ compiler on this system"
  11. 2019测试指南-web应用程序安全测试(二)识别应用程序入口点
  12. Bugku-社工-初步收集
  13. 解决visio2016与本地家庭和学生版office不兼容问题
  14. 【小工具】 - linux内存碎片检查和清理
  15. 年审是当月还是当天_车辆年审到期是指当月吗?
  16. 轻量级日志分析PLG平台Loki安装部署及使用(promtail+loki+Grafana)
  17. Ubuntu系列(一):给英特尔NUC重装 ubuntu18.04 的系统
  18. DBeaver 修改快捷键(自定义快捷键位)
  19. java面试答题软件,Java面试题库
  20. 白话空间统计二十一:密度分析(七) Python实现

热门文章

  1. myeclipse里使用fat jar生成可执行jar
  2. 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
  3. ubuntu上virsh+kvm安装虚拟机
  4. fidder设置断点,修改请求参数等
  5. with ...as ...
  6. 7.Git的版本退回
  7. Oracle SQL (2):SQL Fundamentals(Day II)
  8. 一个好习惯可以让自己享受一辈子
  9. 库依赖关系和开源供应链带来的噩梦
  10. orocod_kdl学习(一):坐标系变换