Docker 1.6.0新特性深度解析
【前言】
Docker 1.6.0的發布,絕對是Docker圈的重磅炸彈。表面上看,這些改動大大完善了Docker的功能,然而細看這些特性,筆者倒是感受到Docker在醞釀著什么驚人的大招。本文詳細介紹了Docker 1.6.0中一些新的特性。
Docker 1.6.0的發布,絕對是Docker圈的重磅炸彈。表面上看,這些改動大大完善了Docker的功能,然而細看這些特性,筆者倒是感受到Docker在醞釀著什么驚人的大招。
首先,來看一下筆者對Docker 1.6.0新特性的理解。
一.Builder方面
允許從一個鏡像ID開始build新鏡像
換言之,Dockerfile中的FROM命令后面可以緊跟一個鏡像ID。好處是Dockerfile的書寫變得靈活,在熟悉Docker鏡像原理的情況下,可以大大提高Docker鏡像build的效率。簡單場景如下,Dockerfile中有兩條RUN命令,第一條命令非常耗時,且運行成功了,而第二條命令失敗。此情形下,完全可以借助前者完成的鏡像繼續build。當然有人會提到本地image cache的問題同樣可以解決該問題,但是image cache的弊端就是只能本地有效。
Build鏡像時允許添加限制參數
這個改動,筆者的感受是:久旱逢甘露,但是僅僅是幾滴。Docker對于docker run命令的限制,即啟動容器時做的資源等種種限制,目前看來還是差強人意。但需要清楚的是,docker build流程中對于RUN命令,Docker Daemon本身也會啟動一個容器,并通過commit容器打成鏡像。此時,如果對于運行RUN命令的容器沒有限制,后果可想而知。為什么說“甘露”僅僅是幾滴,原因是:docker run命令的限制參數目前還沒有全部集成至docker build,而通過Docker Daemon來統一化配置又缺乏靈活。
二.Client方面:支持Windows
考慮到廣大的Windows用戶群體,這肯定是好事一樁,但筆者以為Docker官方對Win粉的愛也只能到這里了。
三. Runtime方面
1.容器label與鏡像label
Label的概念,不知道大家對她是否似曾相識。早在很早之前,Docker Daemon就支持添加label,用于記錄Docker Daemon的角色。Label使得Docker Daemon帶有角色,從而Swarm可以方便的通過角色進行Docker的管理。而如今,label可以添加到容器和鏡像,原來由Docker外的軟件或者人腦記錄的容器角色,現在可以顯性的放在容器的label中了,大大環節容器角色的管理。更大的好處是,label可以在邏輯上關聯容器,會不會在邏輯上有“組”的概念?
2.容器的–cgroup-parent參數
將容器A的cgroup指定到容器B的cgroup內,從而嵌套情況下,A、B的受限效果將建立管理。容器host網絡模式或者other container模式使得容器的隔離留有選擇余地,為Docker場景模式的探索帶來更大的可能性。如今cgroup都嵌套之后,容器與容器間的粘性再一次被放到臺面上,畢竟不是所有容器從邏輯上講是完全隔離的。這一點,絕對是可挖掘性巨大的特性。
3.logging driver
Docker接管了容器的日志管理。從實現的角度來說,貌似不難,這個需求應該也是巨大的。只是苦了那些立志占領Docker容器日志市場的小廠商,如logspout就被Docker很禮貌的請出了游戲。
4.通過鏡像ID下載鏡像
這一特性的推出,也許在Private Registry中發揮的效果更大。熟悉了鏡像原理之后,你會發現,公有的環境下,很少有人會去關注repo下tag化鏡像的某個parent鏡像包含哪些內容,這一點也很不現實。私有registry就不一樣了,私有鏡像的制作,環節、內容自己應該都清楚,如此一來,通過鏡像ID下載鏡像,意義會逐漸體現出來。
–ulimit參數–default-ulimit
千呼萬喚等出來,安全利器。先來看看兩者的區別吧,簡單來講,–ulimit的使用僅僅與docker run命令;若不指定–ulimit,–default-ulimit才會在docker run的情況下有效。再看這倆參數的作用:限制容器的資源使用情況,那就不是簡單的CPU、Mem了。相信大家肯定一直聽說,容器技術有一點弊病就是容器和宿主機共享內核,CPU、Mem等的隔離度有缺陷,其實共享內核的缺陷遠不僅如此,內核的資源是否還應該包括,文件數、進程數、信號數、管道數、系統調用等?那么問題出現了,namespace和cgroup并沒有考慮到所有的情況,而ulimit可以站出來暫時讓Docker的安全避避風聲。簡單的測試如下:若調小–default-ulimit的文件數參數之后,進入容器查看ulimit –a,open files參數就變小了,大家可以測試一番。
容器粘性關于調度,容器安全牽扯內核,鏡像的靈活,如果您還不知道鏡像是什么原理,就out啦。
有關Docker 1.6的詳細介紹,請參考官方博客:
http://blog.docker.com/2015/04/docker-release-1-6/
作者簡介
孫宏亮,DaoCloud初創團隊成員,軟件工程師,浙江大學VLIS實驗室應屆研究生。讀研期間活躍在PaaS和 Docker開源社區,對Cloud Foundry有深入研究和豐富實踐,擅長底層平臺代碼分析,對分布式平臺的架構有一定經驗,撰寫了大量有深度的技術博客。2014年末以合伙人身份加入 DaoCloud團隊,致力于傳播以Docker為主的容器的技術,推動互聯網應用的容器化步伐。郵箱:allen.sun@daocloud.io