关于Docker中的一些概念的个人理解。
之前做了几个docker相关的项目,一直没有好好的总结过。现在对之前的知识进行一下简单的梳理。总结一下docker相关的一些关键概念。水平有限,不当之处欢迎指正。
Docker容器和虚拟机的区别
容器和虚拟机到底有什么区别,看了很多文章、很多资料。发现没几个能够讲得清楚的。还是要自己在实践中去摸索。所以说实践是检验真理的唯一标准,这个命题在科学领域还是很必要去贯彻的。
讲过大道理之后,让我们来真正的探讨这个问题。
虚拟机是什么? 百度百科这样定义——“虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。”。wikipedia这样定义——“In computing, a virtual machine (VM) is an emulation of a computer system. Virtual machines are based on computer architectures and provide functionality of a physical computer. Their implementations may involve specialized hardware, software, or a combination.”。从定义中我们可以看出虚拟机是一个完全仿真的计算机系统。随着云计算技术的兴起,虚拟机的应用迎来了一个前所未有的高潮。
Docker又是什么呢?Docker官方给出的定义是:”Run the application anywhere: Docker containers wrap a piece of software in a complete filesystem that contains everything needed to run. This guarantees that the software will always run the same, regardless of its environment.”。说白了,Docker的目的在于提高应用程序的可移植性和兼容性。其手段就是将程序封装到容器(container)中。这些容器可以部署在任何装有docker的机器之上。
从定义上来看,其实这两个是完全不同的技术,适用场景也不尽相同。为什么会拿两者来进行比较呢?原因在于传统的认识一直存在误区。这就是认为vm和docker都是将放在一个隔离环境里跑,所以他们是可以进行比较的。其实在我看来这个比较是不太恰当的。隔离性是vm的核心特色之一,而并非docker的核心,docker运行的目的是为了 Run the application anywhere 。vm使用hypervisor等技术,实现了资源隔离,这里的隔离目的在于对营造一个独立的运行环境,这个环境在云计算或者安全领域都有着广泛的应用。而docker可以理解成只是将一个application和其必须的一些dependencies放到容器当中去,利用namespace和control group等技术实现隔离运行,这里的隔离运行目的在于使得应用可移植。这是区别一。
区别二:vm是营造了一个虚拟的计算机环境,因此一台vm需要包含一台计算机的所有的、完备的功能,vm是一个庞大的体系。而一个docker容器,是解决某个特殊问题的,只包含了解决这一问题的依赖包,容器只是计算机中运行的一个进程(process)。
以上。
Docker底层的三个关机技术
namespace
程序员理解namespace的概念应该很容易,说白了就是一种隔离机制,将某些东西,如进程编号,文件系统挂载点等进行隔离,避免任务之间的冲突啦。Linux中,同一个namespace下的进程可以相互感知到对方的存在,而不同namespace下的进程是不知道对方的存在的。namespace的类型如下表所示:
Linux提供了一些API(包括clone()、setns()以及unshare())来实现基于namespace的隔离。在使用这些API时,通常需要指定表格中的六个常数的一个或多个,通过|(位或)操作来实现。
更多细节参考这里。
control group
分层文件系统
未完待续