共计 2842 个字符,预计需要花费 8 分钟才能阅读完成。
Java 开发人员需要注意的五大 Docker 误区分别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
我们如何才能更好更理性的使用 Docker?
Docker 最近备受关注,原因显而易见。如何成功交付代码一直困扰着大家。传统的容器技术在众多需求和模板中乱成一团。而 Docker 可以简单且重复的创建容器。相比其它容器,使用 Docker 可以更快、更自然的交付代码。Duang,Docker 火了!随之而来也有一些误解和误区。不要太相信别人说 Docker 好用或者不好用。自己理性地全面思考一下 Docker,会帮助你真正理解是否真的需要它。
丸趣 TV 小编列举了从 Java 角度的五大 Docker 误读。不过首先介绍些背景知识。
主要误区 1. Docker 是轻量级虚拟机
这是大家初学 Docker 时最主要的误解。这种误解倒也情有可原,Docker 的确看上去有点像虚拟机。Docker 网站
上甚至有人比较了 Docker 和虚拟机的区别。但是,Docker 实际上不是轻量级虚拟机,而是改进了的 Linux 容器(LXC
)。Docker 和虚拟机是完全不一样的,如果你把 Docker 容器当成轻量级虚拟机来用,会遇到很多问题。
在使用 Docker 之前,必须了解 Docker 容器和虚拟机有很多本质的区别。
资源隔离:Docker 达不到虚拟机所能提供的资源隔离水平。虚拟机的资源是高度隔离的,而 Docker 从设计之初就需要共享一些资源,这些资源是 Docker 无法隔离和保护的,比如页缓存和 entropy 池
。(注:entropy 池很有趣,entropy 池收集并且存储系统操作生成的随机比特。机器在需要随机化时(比如密码相关)使用这个池。)如果 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 不直接支持对多机器的网络和资源的监控,这使得几乎无法用在生产环境里。当然也有很多有潜力的地方,比如可以将同一个 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 角度看
Docker 在 Java 开发人员中已经有些应用。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 误区分别是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注丸趣 TV 行业资讯频道了解更多相关知识。