本文是一系列对Docker与Kubernetes的学习总结。源材料来源参见文中的链接和最后的参考资料。
容器的原理
虽然有些人会把容器和虚拟机类比,称之为“轻量级的虚拟机”。刚开始接触Docker的时候大多看过下面这张图:
忘记这张图吧。从上一节我们讨论的“容器的意义”就可以看到,容器和虚拟机关注的不是一个层面。
但虚拟机和容器也有共通之处:本质都是欺骗。虚拟机的原理是欺骗CPU/物理内存/物理IO,让硬件感觉自己还是在接收宿主机而非虚拟机的指令。而Docker的原理是欺骗一组进程,让这些进程以为自己活在另一个的操作系统里。
用专业一点的术语,就是:容器的核心功能,就是通过约束进程和修改进程的动态表现,为进程创造出一组“边界”。
以电影作为比方,虚拟机就像《火星救援》里在火星上种土豆的宇航员,在火星上模拟地球的环境,连空气和水都需要自己从头开始制备,成本高昂。
而容器就是《楚门的世界》。男主(容器进程)生活在一个大型影棚里,所有能接触到的世界只有这个影棚。男主住的房子,吃的东西,呼吸的空气来自于地球,生产成本很低。但他所能阅读的报纸,乘坐的载具,观看的电视都是影棚工作人员提供给他的,受到了严格的限制。
对于Docker来说,修改进程的动态表现是通过Namespace,构成进程依赖的文件系统是通过union mount,约束进程是通过Cgroups。