快速理解Docker - 容器级虚拟化解决方案
作者:劉旭暉 Raymond 轉(zhuǎn)載請注明出處
Email:colorant at 163.com
BLOG:http://blog.csdn.net/colorant/
是什么
?
簡單的說Docker是一個構(gòu)建在LXC之上的,基于進程容器(Processcontainer)的輕量級VM解決方案
?
拿現(xiàn)實世界中貨物的運輸作類比,?為了解決各種型號規(guī)格尺寸的貨物在各種運輸工具上進行運輸?shù)膯栴},我們發(fā)明了集裝箱
?
?
?
Docker的初衷也就是將各種應用程序和他們所依賴的運行環(huán)境打包成標準的container/image,進而發(fā)布到不同的平臺上運行
?
?
?
從理論上說這一概念并不新鮮,?各種虛擬機Image也起著類似的作用
?
Docker container和普通的虛擬機Image相比,?最大的區(qū)別是它并不包含操作系統(tǒng)內(nèi)核.
?
?
?
普通虛擬機將整個操作系統(tǒng)運行在虛擬的硬件平臺上,?進而提供完整的運行環(huán)境供應用程序運行,?而Docker則直接在宿主平臺上加載運行應用程序.本質(zhì)上他在底層使用LXC啟動一個Linux Container,通過cgroup等機制對不同的container內(nèi)運行的應用程序進行隔離,權(quán)限管理和quota分配等
?
每個container擁有自己獨立的各種命名空間(亦即資源)包括:
?PID?進程, MNT?文件系統(tǒng), NET?網(wǎng)絡, IPC?, UTS?主機名?等
?
?與LXC有什么不同
?
基本上你可以認為目前的Docker是LXC的一個高級封裝,提供了各種輔助工具和標準接口方便你使用LXC,你可以依靠LXC和各種腳本實現(xiàn)與docker類似的功能,就像你不使用APT/yum等工具也可以自己搞定軟件包安裝一樣,你使用他們的關鍵原因是方便易用!
?
實際使用中,你一般不用關心底層LXC的細節(jié),同時也不排將來docker實現(xiàn)基于非LXC方案的可能性
?
在LXC的基礎上, Docker額外提供的Feature包括:標準統(tǒng)一的打包部署運行方案,?歷史版本控制,?Image的重用,Image共享發(fā)布等等
?
?
Container構(gòu)建方案
?
除了LXC,Docker的核心思想就體現(xiàn)在它的運行容器構(gòu)建方案上
?
?
為了最大化重用Image,加快運行速度,減少內(nèi)存和磁盤footprint, Docker container運行時所構(gòu)造的運行環(huán)境,實際上是由具有依賴關系的多個Layer組成的。例如一個apache的運行環(huán)境可能是在基礎的rootfs image的基礎上,疊加了包含例如Emacs等各種工具的image,再疊加包含apache及其相關依賴library的image,這些image由AUFS文件系統(tǒng)加載合并到統(tǒng)一路徑中,以只讀的方式存在,最后再疊加加載一層可寫的空白的Layer用作記錄對當前運行環(huán)境所作的修改。
?
有了層級化的Image做基礎,理想中,不同的APP就可以既可能的共用底層文件系統(tǒng),相關依賴工具等,同一個APP的不同實例也可以實現(xiàn)共用絕大多數(shù)數(shù)據(jù),進而以copy on write的形式維護自己的那一份修改過的數(shù)據(jù)等
?
歷史和生態(tài)環(huán)境
?
Docker項目從啟動到現(xiàn)在不過一年多時間,發(fā)展勢頭還是很迅猛的
?
2013.01?做為dotcloud內(nèi)部項目開始啟動
2013.03.27?正式作為public項目發(fā)布
2014.1?被BLACK DUCK?評選為2013年10大開源新項目“TOP 10 OPEN SOURCE ROOKIE OF THE YEAR”
?
目前的狀態(tài)?( 2014.3 )
?
Docker 0.8.1
10000+ github stars(top 50)
350+ contributors
1500+ fork
?
?
具體應用方面,可以看到百度至少在2013年10月份就已經(jīng)成功使用Docker支持其BAE平臺的Paas服務
?
安裝運行和使用
?
Docker雖然是號稱build once,?runeverywhere。但是實際上還是受其引擎依賴關系的限制的,目前的版本具體來說對系統(tǒng)要求:
?
- Linux Kernel 3.8+
- LXC?support
- 64bit?OS
- AUFS
?
以上要求,以ubuntu為例,需要12.04?配合?3.8kernel升級,?或者?ubuntu 13.04+
?
在ubuntu12.04上,基本安裝步驟如下
?
sudoapt-get update sudo apt-get install linux-image-generic-lts-raringlinux-headers-generic-lts-raring
sudoapt-key adv --keyserver keyserver.ubuntu.com --recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9
sudosh -c "echo deb?http://get.docker.io/ubuntudocker main\ > /etc/apt/sources.list.d/docker.list"
sudoapt-get update
sudoapt-get install lxc-docker
?
如果你在安裝之前想要先體驗一下docker的基本操作命令等的話,?可以嘗試一下這個在線的live教程https://www.docker.io/gettingstarted/#h_tutorial
?
常用命令
?
分類列一下常用的CLI命令
?
- 倉庫相關
?
search/ pull / push / login etc.
例:docker pull ubuntu?從倉庫下載ubuntuimage
?
- Images?操作相關
?
images/ rmi / build / export? / import / save /load etc.
例:docker images -t?以樹形結(jié)構(gòu)列出當前本地Image
?
- 運行相關
?
run / start / stop / restart / attach /kill etc.
docker run -i -t ubuntu /bin/bash??啟動ubuntu image,并交互式的運行shell
?
- 雜項
?
Docker diff? / commit
Dockerinfo / ps / inspect / port / logs / top / history etc.
?
?
具體docker命令的使用參見?http://docs.docker.io/en/latest/reference/commandline/
?
常見問題
?
- 使用Non root?用戶
?
目前版本的docker由于使用Socket進行通訊,因此需要root用戶權(quán)限?sudo xxx,或者將需要使用Dockerclient的用戶加入docker用戶組
sudogpasswd -a ${USER} docker
?
- 網(wǎng)絡相關問題
?
當你在網(wǎng)關背后需要通過代理連接docker的index數(shù)據(jù)庫時,可以手動加上http_proxy環(huán)境變量來啟動dockerdaemon
?
HTTP_PROXY=http://proxy_server:port?docker -d &
?
更好的做法是修改/etc/default/docker ( on ubuntu ),?添加?exporthttp_proxy=proxy_server:port
?
同樣,docker container?如果無法自動正確的從host環(huán)境中獲得DNS的配置,則需要手動指定DNS服務器地址,這可以通過?docker -run --dns=xxx?來實現(xiàn),也可以修改/etc/default/docker?添加例如?DOCKER_OPTS="-dns?8.8.8.8"
?
- 特權(quán)模式
?
在正常情況下?在container內(nèi)部你沒有權(quán)限操作device設備,而當前版本中,container內(nèi)部部分文件例如/etc/hosts;/etc/hostname; /etc/resolve.conf等文件是動態(tài)通過mount動態(tài)以只讀的形式加載上來的,理論上說你應該找到合適的方法去保證這些自動生成并加載的文件的正確性?(例如?通過--dns?設置?resolve.conf ),但是如果由于特殊原因你需要手動修改,那么你可以通過特權(quán)模式啟動?docker client?:docker run --privileged?,然后你可以卸載這些文件,自己再創(chuàng)建新的版本
?
- 過多的層級依賴關系
?
以Layer的方式實現(xiàn)APP和相關library的cheap reuse和fast update是Docker的關鍵所在,不過受目前AUFS文件系統(tǒng)的限制,默認Layer的層級最多只能達到127(曾經(jīng)只有42),在實際使用中有多種情況可能導致你的container的層級關系快速增長到這個極限值,撇開這么多layer疊加以后AUFS的效率不談,更多情況下是你無法再更新構(gòu)建你的image了
?
?
前兩者在一定程度上還是你自己可能把控的,最后一種情況就沒辦法了。這個問題最終必將影響Docker的實際可用性,目前的解決方案包括:
?
- 使用Dockerfile時,盡可能合并多個操作:例如使用?"&&"?或?";"?合并運行多個shell命令;將多個shell命令寫成腳本,在dockerfile中添加并運行這個腳本
- 通過Export再Import Image,丟棄所有歷史信息和依賴關系,創(chuàng)建一個全新的image
?
將來可能的解決方案包括:
?
- 在Dockerfile中添加對多步操作的合并提交的支持
- 外部的image Flat工具的支持,目標是能夠保留歷史信息等
- 非AUFS的其它Storage解決方案
?
?
?
Future development
?
雖然Docker目前默認使用LXC和AUFS,但是Docker的核心思想本身,并不強制綁定這兩者,0.8版本已經(jīng)可以使用BTRFS,而整個Docker框架也改成了插件式的架構(gòu),便于添加替換各個功能模塊
?
?
?
例如更多的Storage方案的支持,規(guī)避AUFS當前的問題,除了LXC以外更多的虛擬化方案等
總結(jié)
以上是生活随笔為你收集整理的快速理解Docker - 容器级虚拟化解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qemu源码架构
- 下一篇: C编译器、链接器、加载器详解