Docker原理03

最后,咱们聊一下,Docker是如何实现虚拟化的。

1、先说一下Docker镜像
Docker多层文件系统
从图上可以看出,每一个镜像由一系列的层(layers)组成(Debian,Add Emacs,Add Apache,writable,但不包括内核,内核是与宿主机公用的)。

可如下复现:下载Debian镜像(200m),添加Emacs(20m)后,生成一个新的镜像,然后添加Apache(80m)后,生成了下一个新的镜像,然后运行时,挂在了一个可读写曾,供应用软件写数据。
如果不用分层式架构,那Debian镜像为200m,Emacs镜像为220m,Apache镜像为300m,你的硬盘一共需要720m。而分层后,各层只需要存储与原来不同的文件,所以结果为Debian镜像为200m,Emacs镜像为20m,Apache镜像为80m,你的硬盘一共需要300m。
分层的另外一个好处是,如果你希望新建一个Jetty(60m)镜像,同样可以从Debian镜像进行,这样相互之间就可以很好的复用已有镜像了。同样的,镜像升级的时候,也只需要更新自己所在的层,重新打包一个镜像,就可以升级完毕了。

那分层镜像架构,在运行时,是如何挂载到一起的呢?
答案是联合文件系统(UnionFS)。Union文件系统允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统,所以可以方便的将这些层联合到一个镜像中。

2、再说一下容器是实现隔离的呢?
容器主要作用是隔离工作空间,虚拟机之间相互隔离,虚拟机与宿主机之间也相互隔离。当容器运行的时候,Docker就需要为该容器创建一个命名空间集合,每一个应用在它们自己的命名空间中运行而且不会访问到命名空间之外。
现在常用的容器有:Linux的LXC,BSD的Jails,Solaris的Zone等。

Docker使用到的命名空间有:
pid命名空间: 使用在进程隔离(PID: Process ID)。
net命名空间: 使用在管理网络接口(NET: Networking)。
ipc命名空间: 使用在管理进程间通信资源 (IPC: InterProcess Communication)。
mnt命名空间: 使用在管理挂载点 (MNT: Mount)。
uts命名空间: 使用在隔离内核和版本标识 (UTS: Unix Timesharing System)。

3、容器是如何管理硬件资源的呢?
答案是群组控制。
群组控制允许Docker分享或者限制容器使用硬件资源。
Docker使用了cgroups技术来管理群组。

Leave a Reply

Your email address will not be published. Required fields are marked *

*