Mesos和Docker的集成

摘要: 众所周知,Mesos全面支持Docker。可是这意味着什么呢?在命令行里运行docker run...就可使用Docker了。还须要作什么?让咱们一块儿研究下Mesos的高级特性——和Docker的集成。本文选自《用Mesos框架构建分布式应用》。web

  由于Docker自己想管理整个容器,从chroot、命名空间到整个命名空间的cgroup,它会和默认的Mesos容器发生冲突。所以,Mesos添加了容器机的支持,一种可插拔的机制,让Mesos的容器机子系统可扩展:最初Mesos的基于 LXC/cgroup的容器被引入到容器机API里,Docker是添加的第一个新的容器机,如今也有了全面的文档协议,介绍如何添加新的容器机,好比KVM虚拟机。docker

使用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框架构建分布式应用》,点此连接可在博文视点官网查看此书。
                    图片描述框架

  想及时得到更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       图片描述webapp

相关文章
相关标签/搜索