Java基础、中级、高级、架构面试资料

从根上理解 Docker 是个啥,Docker 原理解剖

JAVA herman 1585浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

早都想写 Docker 了,只是一直太忙!直到最近越来越多的网友再咨询我,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 的学习更有帮助!以上,纯属业余草一家之言,欢迎大家评论交流!

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 从根上理解 Docker 是个啥,Docker 原理解剖