关于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的类型如下表所示:

1
2
3
4
5
6
7
8
|Namespace|系统调用参数|隔离内容|
|:---|:---:|:---:|
|UTS|CLONE_NEWUTS|主机名与域名|
|IPC|CLONE_NEWIPC|信号量、消息队列和共享内存|
|PID|CLONE_NEWPID|进程编号|
|Network|CLONE_NEWNET|网络设备、网络栈、端口等|
|Mount|CLONE_NEWNS|挂载点(文件系统)|
|User|CLONE_NEWUSER|用户和用户组|


Linux提供了一些API(包括clone()、setns()以及unshare())来实现基于namespace的隔离。在使用这些API时,通常需要指定表格中的六个常数的一个或多个,通过|(位或)操作来实现。

更多细节参考这里

control group

分层文件系统

未完待续