还不懂Docker?一个故事安排的明明白白

程序员受苦久矣多年前的一个夜晚,风雨大作,一个名叫Docker的年轻人来到linux帝国拜见帝国的长老 。

还不懂Docker?一个故事安排的明明白白

文章插图
 
“Linux长老,天下程序员苦于应用部署久矣,我要改变这一现状,希望长老你能帮帮我”
长老回答:“哦,小小年纪,口气不小,先请入座,你有何所求,愿闻其详”
Docker坐下后开始侃侃而谈:“当今天下,应用开发、测试、部署,各种库的依赖纷繁复杂,再加上版本之间的差异,经常出现在开发环境运行正常,而到测试环境和线上环境就出问题的现象,程序员们饱受此苦,是时候改变这一状况了 。”
还不懂Docker?一个故事安排的明明白白

文章插图
 
Docker回头看了一眼长老接着说到:“我想做一个虚拟的容器,让应用程序们运行其中,将它们需要的依赖环境整体打包,以便在不同机器上移植后,仍然能提供一致的运行环境,彻底将程序员们解放出来!”
Linux长老听闻,微微点头:“年轻人想法不错,不过听你的描述,好像虚拟机就能解决这个问题 。将应用和所依赖的环境部署到虚拟机中,然后做个快照,直接部署虚拟机不就可以了吗?”
Docker连连摇头说到:“长老有所不知,虚拟机这家伙笨重如牛,体积又大,动不动就是以G为单位的大小,因为它里面要运行一个完整的操作系统,所以跑起来格外费劲,慢就不说了,还非常占资源,一台机器上跑不了几台虚拟机就把性能拖垮了!而我想要做一个轻量级的虚拟容器,只提供一个运行环境,不用运行一个操作系统,所有容器中的系统内核还是和外面的宿主机共用的,这样就可以批量复制很多个容器,轻便又快捷”
还不懂Docker?一个故事安排的明明白白

文章插图
 
Linux长老站了起来,来回踱步了几圈,思考片刻之后,忽然拍桌子大声说到:“真是个好想法,这个项目我投了!”
Docker眼里见光,喜上眉梢,“这事还真离不开长老的帮助,要实现我说的目标,对进程的管理隔离都至关重要,还望长老助我一臂之力!”
“你稍等”,Linux长老转身回到内屋 。没多久就出来了,手里拿了些什么东西 。
“年轻人,回去之后,尽管放手大干,我赐你三个锦囊,若遇难题,可依次拆开,必有大用”
还不懂Docker?一个故事安排的明明白白

文章插图
 
Docker开心的收下了三个锦囊,拜别Linux长老后,冒雨而归 。
【文章福利】需要C/C++ Linux服务器架构师学习资料加群812855908(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)
还不懂Docker?一个故事安排的明明白白

文章插图
 
锦囊1:chroot & pivot_root受到长老的鼓励,Docker充满了干劲,很快就准备启动他的项目 。
作为一个容器,首要任务就是限制容器中进程的活动范围——能访问的文件系统目录 。决不能让容器中的进程去肆意访问真实的系统目录,得将他们的活动范围划定到一个指定的区域,不得越雷池半步!
到底该如何限制这些进程的活动区域呢?Docker遇到了第一个难题 。
苦思良久未果,Docker终于忍不住拆开了Linux长老送给自己的第一个锦囊,只见上面写了两个函数的名字:chroot & pivot_root 。
Docker从未使用过这两个函数,于是在Linux帝国四处打听它们的作用 。后来得知,通过这两个函数,可以修改进程和系统的根目录到一个新的位置 。Docker大喜,长老真是诚不欺我!
有了这两个函数,Docker开始想办法怎么来“伪造”一个文件系统来欺骗容器中的进程 。
还不懂Docker?一个故事安排的明明白白

文章插图
【还不懂Docker?一个故事安排的明明白白】 
为了不露出破绽,Docker很聪明,用操作系统镜像文件挂载到容器进程的根目录下,变成容器的rootfs,和真实系统目录一模一样,足可以以假乱真:
$ ls /bin dev etc home lib lib64 mnt opt proc root run sbin sys tmp usr var锦囊2:namespace文件系统的问题总算解决了,但是Docker不敢懈怠,因为在他心里,还有一个大问题一直困扰着他,那就是如何把真实系统所在的世界隐藏起来,别让容器中的进程看到 。


推荐阅读