摘要: 衆所周知,Mesos全面支持Docker。可是這意味着什麼呢?在命令行裏運行docker run...就可使用Docker了。還須要作什麼?讓咱們一塊兒研究下Mesos的高級特性——和Docker的集成。本文選自《用Mesos框架構建分佈式應用》。web
由於Docker自己想管理整個容器,從chroot、命名空間到整個命名空間的cgroup,它會和默認的Mesos容器發生衝突。所以,Mesos添加了容器機的支持,一種可插拔的機制,讓Mesos的容器機子系統可擴展:最初Mesos的基於 LXC/cgroup的容器被引入到容器機API裏,Docker是添加的第一個新的容器機,如今也有了全面的文檔協議,介紹如何添加新的容器機,好比KVM虛擬機。docker
爲了使用Docker容器機技術,必須將其包含進Mesos slave的命令行裏。好比,mesos-slave --containerizers=docker,mesos...容許在該臺slave上使用Docker和Mesos容器。
可能還想增長執行器的註冊超時時間,這樣Mesos不會在容器還在下載的時候就認爲容器發生了故障。一開始能夠設成五分鐘,確保有足夠的時間下載Docker鏡像。因此,slave命令行相似:shell
mesos-slave --containerizers=docker,mesos \ --executor_registration_timeout=5mins ...
使用帶有應用程序的Docker很是簡單——一旦啓用了對Docker的支持,只須要設置TaskInfo或者ExecutorInfor裏的container字段(類型爲ContainerInfo)。微信
使人困惑的是,消息CommandInfo.ContainerInfo並非正確的消息——須要在帶有Docker相關字段的mesos.proto裏設置最高級別的ContainerInfo。網絡
要想使用Docker,須要將ContainerInfo裏的type設置爲DOCKER,而且將docker字段設置到ContainerInfo.Docker消息的一個實例裏,該消息的image屬性設置爲Docker鏡像的名稱(好比myusername/webapp)。這裏能夠配置不少Docker參數,好比是使用HOST仍是BRIDGE網絡,映射使用哪些端口或者額外的Docker命令行參數。若是想讓Docker容器使用Dockerfile裏指定的docker run ...,還必須將TaskInfo的CommandInfo設置成shell=false。若是設置成shell=true,就須要禁用Dockerfile裏的run,指定的command會由sh -c 「」來運行。
當啓動Docker容器機任務時,slave會首先獲取(而且解包)沙箱裏全部指定的URI,而且將Docker鏡像拉取到本地。而後,slave經過運行docker啓動Docker鏡像。docker命令的HOME環境變量指向該沙箱,所以能夠經過獲取到的URI來配置Docker(詳見下面的注意事項)。在Docker鏡像裏可使用該沙箱,其路徑保存在MESOS_SANDBOX環境變量裏。最後,Docker的stdout和stderr會被重定向到Mesos沙箱裏名爲stdout和stderr的文件上。架構
高級Docker配置
必須記住的一點是,Docker容器機老是會嘗試從registry里拉取Docker鏡像。這意味着沒法使用僅在本地安裝了的Docker鏡像——必須在某個地方部署該鏡像。若是想要使用私有registry,能夠提供一個.dockercfg文件。該文件由一個URI指定,這樣Mesos slave就可以使用其自動獲取URL的功能將.dockercfg文件拷貝到Docker進程所使用的HOME目錄下。app
相同的API也適用於基於Docker的執行器,惟一不一樣之處在於,執行器代碼實際上能夠在Docker容器內運行。要實現這一目的,須要完成上文所述的全部事情,可是是在ExecutorInfo消息裏,而不是TaskInfo消息裏。
本文選自《用Mesos框架構建分佈式應用》,點此連接可在博文視點官網查看此書。
框架