早都想写 Docker 了,只是一直太忙!直到最近越来越多的网友再咨询我,Docker 为什么有优势?Docker 和虚拟机有什么本质上的区别?。。。所以,整体写个文章,说说 Docker 到底是个啥!
其实,从 Docker 的图标上就可以看出来。Docker 就像鱼一样,可以浅的很深,更轻量级,并且可以抗很多集装箱。而传统的虚拟机,就像笨重的船一样,难调头不说,本身重量就很大,载重的货物反而比 Docker 还差!
这么说,你可能还是觉得显得太抽象,下面我从它们的设计和实现原理上来给你唠叨唠叨!
假设你现在需要安装一个虚拟机,那么你先得安装一个 VMware 或者 VirtualBox。然后再挂载一个 OS 系统。
总共需要分两步,第一步的 VMware 或 VBox 就是虚拟化出一套硬件环境出来,第二步就相当于给新电脑安装了一个操作系统。
假设一个操作系统,要吃掉对于硬件部分的 10% 的性能,你现在在操作系统上安装了操作系统,那么 20% 的性能可能就白白浪费掉了,还不说你还整个 VMware 或 VBox。
而 Docker 呢?并不需要吃掉这么多的资源!
Docker 并不是一项新技术,而是在原有的 Linux 上,巧妙的借助 Cgroup 和 namespace 来实现的。
namespace(命名空间) 是 Linux 提供的一种内核级别环境隔离的方法,很多编程语言也有 namespace 这样的功能,例如 C++,Java 等,编程语言的 namespace 是为了解决项目中能够在不同的命名空间里使用相同的函数名或者类名。而 Linux 的 namespace 也是为了实现资源能够在不同的命名空间里有相同的名称,譬如在 A 命名空间 有个 pid 为 1 的进程,而在 B 命名空间 中也可以有一个 pid 为 1 的进程。
Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
所以,有了 Namespace 之后,你在 Docker 里执行 ps 后,是看不到其它的进程的,只能看到容器内的进程。容器就是一个沙盒,现在通过容器就把你隔离起来了。
除了 Namespace,Cgroup 对 Docker 来说,也显得非常的重要。
Cgroup 以分组的形式对进程使用系统资源的行为进行管理和控制。也就是说,用户通过 cgroup 对所有进程进行分组,再对该分组整体进行资源的分配和控制。
通过 Cgroup 我们就可以实现对硬件资源的分配。比如,CPU、内存,磁盘,网络等进行再分配。比如,一个 8 核的 CPU,我就可以分配成 8 个一核或者 4 个两核,也或者是 2 个 4 核。
看到现在你是不是感觉 Docker 其实很简单,云计算也很简单?但是,别看这么简单的东西,当初马化腾和李彦宏都没抓住,一个认为时机未到,一个认为老瓶装新酒。只有不懂技术的马云,反而成功了!
Namespace 和 Cgroup 是 Docker 的两大基石,Docker 本身还有很多问题需要解决,比如时间,你不管是用 Namespace 还是 Cgroup,都不能对他进行隔离化。除此之外,还有很多“越狱”问题,都是坑。
总之,我相信你明白 Docker 的原理后,对 Docker 的学习更有帮助!以上,纯属一家之言,欢迎大家评论交流!
: » 从根上理解 Docker 是个啥,Docker 原理解剖
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/252125.html