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。但是,现在这个领域的确有很多的炒作。不过记住哦,炒作可不是成功~
Java程序员需要注意的五大Docker误区的更多相关文章
- Java程序员需要突破的技术要点
一.源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂. 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心. 我认为是阅读源码的最核心 ...
- JAVA程序员面试30问(附带答案)
第一,谈谈final, finally, finalize的区别. 最常被问到.final修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能 ...
- 为什么说Java程序员到了必须掌握Spring Boot的时候?
摘要: SpringBoot的来龙去脉. 原文:为什么说 Java 程序员到了必须掌握 Spring Boot 的时候? 微信公众号:纯洁的微笑 Fundebug经授权转载,版权归原作者所有. Spr ...
- 为 Java 程序员准备的 Go 入门 PPT
为 Java 程序员准备的 Go 入门 PPT 这是 Google 的 Go 团队技术主管经理 Sameer Ajmani 分享的 PPT,为 Java 程序员快速入门 Go 而准备的. 视频 这个 ...
- 如何突破JAVA程序员三年的门槛
第一阶段:三年 我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人.这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本 上的内容迈向真正的企业级开发.我们知道如何团 ...
- 十面阿里 Java 程序员,最终拿下阿里 P6 offer!
转子:https://mp.weixin.qq.com/s/RkMxPbm8E99-rTZKmvBy6Q 今天介绍小编的一个朋友,他现今有四年开发经验了,前前后后为了进阿里面试十次(阿里旗下—蚂蚁金服 ...
- 月薪 30K Java 程序员,需要掌握哪些技术?
转载自:Java3y 1-5年的Java程序员,薪资区间大致是在15-25K左右,那有没有可能提前达到30K的薪资呢?有人说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业 ...
- 2020年Java程序员应该学习的10大技术
对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...
- 2020 年 Java 程序员应该学习什么?
大家好,我相信大家在新的一年都有一个良好的开端,并准备好制定一个提升自我技术的目标.作为 Java 开发人员,我还制定了一些目标,希望在今年成为一名更好的 Java 开发人员. 如果你尚未制定目标,这 ...
随机推荐
- Command 命令模式
简介 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于[行为请求者]与[行为实现者]解耦,可实现二者之间的松耦合,以便适应变化. 将一个请求封装为一个对象,从而使你可用不同 ...
- application/json IE 兼容问题
由于IE系列浏览器把application/json响应视为文件,并尝试下载在网上看了一下,大致了解,只要修改返回的内容的类型(ContentType)即可解决问题. 由于ajax请求,返回类型默认就 ...
- JavaScript 标识符
JavaScript 标识符 和其他任何编程语言一样,JavaScript 保留了一些标识符为自己所用. JavaScript 同样保留了一些关键字,这些关键字在当前的语言版本中并没有使用,但在以后 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第三章:搜索、高级过滤和视图模型
在这一章中,我们首先添加一个搜索产品的模块以增强站点的功能,然后使用视图模型而不是ViewBag向视图传递复杂数据. 注意:如果你想按照本章的代码编写示例,你必须完成第二章或者直接从www.apres ...
- Java Calendar 计算时间差
public static void main(String[] args) { Calendar c=Calendar.getInstance(); int y=2016;//年 int M=1;/ ...
- 【USACO 3.1.1】最短网络
[描述] 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的场.当然,他需要你的帮助. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共 ...
- 7 Reverse Integer(数字反转Easy)
题目意思:int数字反转 考虑:越界问题 class Solution { public: int reverse(int x) { ; while(x){ ans=ans*+x%; x=x/; } ...
- jquery实现页面置顶功能代码
<html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...
- javescript扩展方法
<script type="text/javascript"> //扩展方法 '原型'->'prototype' //通过类对像的prototype设置扩展方法 ...
- UVA - 12627 Erratic Expansion 奇怪的气球膨胀 (分治)
紫书例题p245 Piotr found a magical box in heaven. Its magic power is that if you place any red balloon i ...