首页 > 编程知识 正文

为什么要使用docker(docker和虚拟机的区别)

时间:2023-05-04 18:51:39 阅读:80144 作者:2894

程序员受苦久矣

多年前的一个晚上,风雨交加,一个叫Docker的年轻人来到Linux帝国见帝国长老。

“Linux的长老,天下的程序员苦于引进APP。 我要改变这个现状。 我希望长老能帮助我。”

长老回答说。 “啊,年轻的年纪,口气不小。 请先入席。 你在追求什么? 我想问一下那个的详细情况。”

Docker坐下开始侃侃而谈。 “今天,APP开发、测试、部署、对各种库的依赖很复杂,也有版本间的差异,开发环境正常工作,但一旦进入测试环境和在线环境,经常会出现问题,程序员们在改变这种情况时”

Docker回头看着长老说。 “我想做一个虚拟容器,让APP们运行,把它们需要的整个依赖环境打包,移植到不同的机器后也提供一致的运行环境,让程序员们完全解脱! ”

Linux的长老听了之后,点了点头。 “年轻人的想法很好,但听你的解释,似乎虚拟机可以解决这个问题。 将APP和依赖的环境部署到虚拟机上,拍摄快照,然后直接部署虚拟机,不是很好吗? ”

Docker连连摇头说。 “长老们什么都不知道。 虚拟机就像牛一样又重又大,很快就是g单位的大小。 其中必须运行完整的操作系统,所以跑起来很辛苦。 慢当然,非常占用资源。 如果一台机器不能运行好几台虚拟机,性能就会受损。 而且,我想做一个轻量级的虚拟集装箱。 提供一个运行环境,即使不运行一个操作系统,所有容器中的系统核心也与外部主机共享。 这样的话,可以批量复制很多集装箱,又轻又快。”

Linux长老站起来,来回走了好几次,想了一会儿后,突然敲了一下桌子,大声说。 “好主意。 这个项目是我扔的! ”

Docker目光炯炯,欣喜若狂。 “这真的离不开长老的帮助。 为了实现我所说的目标,过程的管理隔离是非常重要的。 我期待着长老能帮助我! ”

“请稍等”,Linux长老转身回到室内。 过了一会儿出来了,手上拿着什么东西。

“年轻人,回去后,即使放弃大工作,我也会给你三个锦囊。 如果遇到难题,依次分解,一定会有很大的作用。”

Docker高兴地接过三个锦囊,和Linux的长老告别后,在雨中回去了。

【文章福利】C/C Linux服务器架构师学习资料加组812855908 (资料来源于C/C,Linux,谷歌技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,Mongoogo

锦囊1:chroot pivot_root

长老的鼓励下,Docker充满了干劲,准备马上开始他的项目。

作为容器,最重要的是限制容器中进程的活动范围——可以访问的文件系统目录。 不能随便容器里的过程

访问真实的系统目录,得将他们的活动范围划定到一个指定的区域,不得越雷池半步!

到底该如何限制这些进程的活动区域呢?Docker遇到了第一个难题。

苦思良久未果,Docker终于忍不住拆开了Linux长老送给自己的第一个锦囊,只见上面写了两个函数的名字:chroot & pivot_root。

Docker从未使用过这两个函数,于是在Linux帝国四处打听它们的作用。后来得知,通过这两个函数,可以修改进程和系统的根目录到一个新的位置。Docker大喜,长老真是诚不欺我!

有了这两个函数,Docker开始想办法怎么来“伪造”一个文件系统来欺骗容器中的进程。

为了不露出破绽,Docker很聪明,用操作系统镜像文件挂载到容器进程的根目录下,变成容器的rootfs,和真实系统目录一模一样,足可以以假乱真:

$ ls / kkdgq dev etc home lib lib64 mnt opt proc root run skkdgq sys tmp usr var

锦囊2:namespace

文件系统的问题总算解决了,但是Docker不敢懈怠,因为在他心里,还有一个大问题一直困扰着他,那就是如何把真实系统所在的世界隐藏起来,别让容器中的进程看到。

比如进程列表、网络设备、用户列表这些,是决不能让容器中的进程知道的,得让他们看到的世界是一个干净如新的系统。

Docker心里清楚,自己虽然叫容器,但这只是表面现象,容器内的进程其实和自己一样,都是运行在宿主操作系统上面的一个个进程,想要遮住这些进程的眼睛,瞒天过海,实在不是什么容易的事情。

Docker想过用HOOK的方式,欺骗进程,但实施起来工作太过复杂,兼容性差,稳定性也得不到保障,思来想去也没想到什么好的主意。

正在一筹莫展之际,Docker又想起了Linux长老送给自己的锦囊,他赶紧拿了出来,打开了第二个锦囊,只见上面写着:namespace。

Docker还是不解其中之意,于是又在Linux帝国到处打听什么是namespace。

经过一阵琢磨,Docker总算是明白了,原来这个namespace是帝国提供的一种机制,通过它可以划定一个个的命名空间,然后把进程划分到这些命名空间中。

而每个命名空间都是独立存在的,命名空间里面的进程都无法看到空间之外的进程、用户、网络等等信息。

这不正是Docker想要的吗?真是踏破铁鞋无觅处,得来全不费功夫!

Docker赶紧加班加点,用上了这个namespace,将进程的“视野”锁定在容器规定的范围内,如此一来,容器内的进程彷佛被施上了障眼法,再也看不到外面的世界。

锦囊3:CGroup

文件系统和进程隔离的问题都解决了,Docker心里的石头总算是放下了。心里着急着想测试自己的容器,可又好奇这最后一个锦囊写的是什么,于是打开了第三个锦囊,只见上面写着:CGroup。

这又是什么东西?Docker仍然看不懂,不过这一次管不了那么许多了,先运行起来再说。

试着运行了一段时间,一切都在Docker的计划之中,容器中的进程都能正常的运行,都被他构建的虚拟文件系统和隔离出来的系统环境给欺骗了,Docker高兴坏了!

很快,Docker就开始在Linux帝国推广自己的容器技术,结果大受欢迎,收获了无数粉丝,连nginx、redis等一众大佬都纷纷入驻。

然而,鲜花与掌声的背后,Docker却不知道自己即将大难临头。

这天,Linux帝国内存管理部的人扣下了Docker准备“处决”掉他,Docker一脸诧异的问到,“到底发生了什么事,为什么要对我下手?”

管理人员懵懂的大炮说到:“帝国管理的内存快被一个叫Redis的家伙用光了,现在要挑选一些进程来杀掉,不好意思,你中奖了”

Redis?这家伙不是我容器里的进程吗?Docker心中一惊!

“两位大人,我认识帝国的长老,麻烦通融通融,找别人去吧,Redis那家伙,我有办法收拾他”

没想到他还认识帝国长老,管理人员犹豫了一下,就放了Docker到别处去了。

惊魂未定的Docker,思来想去,如果不对容器中的进程加以管束,那简直太危险了!除了内存,还有CPU、硬盘、网络等等资源,如果某个容器进程霸占着CPU不放手,又或者某个容器进程疯狂写硬盘,那迟早得连累到自己身上。看来必须得对这些进程进行管控,防止他们干出出格的事来。

这时候,他想起了Linux长老的第三个锦囊:CGroup!说不定能解这燃眉之急。

经过一番研究,Docker如获至宝,原来这CGroup和namespace类似,也是Linux帝国的一套机制,通过它可以划定一个个的分组,然后限制每个分组能够使用的资源,比如内存的上限值、CPU的使用率、硬盘空间总量等等。系统内核会自动检查和限制这些分组中的进程资源使用量。

Linux长老这三个锦囊简直太贴心了,一个比一个有用,Docker内心充满了感激。

随后,Docker加上了CGroup技术,加强了对容器中的进程管控,这才松了一口气。

在Linux长老三个锦囊妙计的加持下,Docker可谓风光一时,成为了Linux帝国的大名人。

然而,能力越大,责任越大,让Docker没想到的是,新的挑战还在后面。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。