Redhat下Docker、LXC、CGroup的协同配置

1、Redhat系列操做系统下的Dockergit

   Redhat系列操做系统(redhat、centos、fedora)与ubuntu是目前最为流行的两款Linux操做系统。因为ubuntu更为桌面化,一般生产环境中更多使用Redhat系OS。可是因为Redhat系内核版本较低,对虚拟化的支持老是落后一步。例如本文要分析的Docker,就是先支持ubuntu,直到2013年年末才支持redhat系OS。这就形成了一个略显尴尬的现实,虽然(截止目前)ubuntu对Docker支持更好,可是不少时候咱们仍是要在Redhat环境下使用Docker。github

   目前,Redhat已与Docker深度合做,解决兼容性、安全等Docker的核心问题。考虑到两者的技术实力,我以为他们的合做前景是比较乐观的。不过目前,若是在Redhat或Centos下实际操做Docker,会发现坑仍是比较多的。今天,我就来尝试介绍其中的一个坑——Redhat下Docker、LXC、CGroup的协同配置。docker


2、Docker、LXC、CGroup三者的关系ubuntu

   根据Docker布道师Jerome Petazzoni的说法,Docker约等于LXC+AUFS(以前只支持ubuntu时)。其中LXC负责资源管理,AUFS负责镜像管理;而LXC又包括cgroup、namespace、chroot等组件,并经过cgroup进行资源管理。因此只从资源管理这条线来看的话,Docker、LXC、CGroup三者的关系是:Cgroup在最底层落实资源管理,LXC在cgroup上封装了一层,Docker又在LXC封装了一层,关系图如图1.b所示。centos

wKiom1MBeDvz6C24AAFj5lAmO3Q959.jpgwKioL1LbwN3ykfYmAADIayV7OHg227.jpg

(a)                                   (b)安全

图1 Docker-LXC-CGroup结构图bash


3、Docker、LXC、CGroup三者的协同部署与配置ide

   因为Docker、LXC、Cgroup的关系为嵌套依赖,因此若是须要实际部署使用Docker,须要搞定三者的协同配置。Docker没什么可说的,直接使用最新版本便可。LXC则有不一样版本,且不一样版本的运行状况明显不一样。经常使用稳定版本有http://sourceforge.net/projects/lxc/files/lxc/网站上的0.7.五、0.9.0,除此以外,还有git上lxc的最新版本 https://github.com/lxc/lxc,目前为1.0.0beta2(未正式发布)。cgroup也有不一样的挂载方法:“多挂载点”和“单挂载点”。了解cgroup的朋友都知道,cgroup有不一样的子系统,例如cpu、memory、cpuset等等,“多挂载点”就是指不一样子系统的文件挂载在不一样的目录下,每一个子系统各有一个挂载点,目录结构如图2所示。cgroup对应服务cgconfig默认使用的就是“多挂载点”的方法。“单挂载点”则是指全部子系统的文件都挂载在同一个目录下,全部子系统都统一挂载在一个挂载点,目录结构如图3所示。测试

wKioL1LcpWPyXdUNAAA8a6SxaGI923.jpg

图2 多挂载点目录示意图网站

wKioL1LcpiOxa_KUAAQEMBSdJMs541.jpg

图3 单挂载点目录示意图

   结合上述不一样版本和不一样挂载方法,Docker、LXC、CGroup在Redhat/CentOS上的部署方法汇总如表1所示。

表1

Docker

LXC

Cgroup

运行状况



0.7

0.7.5

单挂载点

正常

多挂载点

报错,形如 lxc-execute: nons_cgroup option specified lxc-execute: failed to spawn 'xxx' lxc-execute: Nosuch file or directory - failed to remove cgroup '/cgroup/cpuset/xxx'

0.9.0

单挂载点

报错,形如 lxc-execute: Error creating  cgroups   lxc-execute: failed to spawn 'xxx'。结合Docker运行将致使docker阻塞(卡主)

多挂载点

看似正常运行,但没法实现资源管理。cgrouplxc上层参数异常,没法经过lxc-cgroup等命令设置参数

1.0.0Beta2

Git最新版,未正式发布

单挂载点

正常

多挂载点

报错,形如 lxc-execute: Device or resource busy -  cgroup_rmdir: failed to delete /cgroup/ns/

lxc-execute:  failed creating cgroups lxc-execute: failed to spawn 'lxc1'

   先看表1前四行,其实在正式使用Docker以前,我已发现了这些问题。不过因为LXC的中文资料较少(介绍性资料有一些,实战性、有些深度的就比较少了),LXC英文社区又比较冷清,因此只发现一些朋友和我遇到了一样的问题,却没有靠谱的解决方法。好在“lxc-0.7.5 + cgroup单挂载点”是能够work的,我就是用这种配置方法进行工做。

   后来使用Docker,因为docker-0.7.2默认使用lxc-0.9.0.2,没法正常运行,我又从新捡起了这个问题。因为Docker社区比较热,在一篇来来每每十几个回合的帖子里找到了另外一种解决方案,方法就是更新lxc。经实际测试,“Docker + lxc-1.0.0Beta2 + cgroup单挂载点”的方法能够正常运行。

wKioL1Lb0HTxIHELAAGxwpvvOII967.jpg



4、Centos下Docker、LXC、CGroup的安装配置方法

   第三部分汇总了不一样部署方法的运行状况,本节(第四部分)着重梳理下可行方法的步骤。实验证实,“Docker + lxc-0.7.5 + 单挂载点”与“Docker + lxc-1.0.0Beta2 + 单挂载点”方法都可行。

   实验环境:Centos6.3 + 内核2.6.32

   一、按照官方文档(http://docs.docker.io/en/latest/installation/rhel/),在Centos上安装docker。

   二、更新lxc。

   在lxc网站(http://sourceforge.net/projects/lxc/files/lxc/)下载lxc-0.7.5,或者在git(https://github.com/lxc/lxc)上 ,下载最新版的lxc,我下载时是1.0.0Beta2。下载后进行安装。因为Docker按照绝对路径/usr/bin/lxc-xxxx调用lxc命令,因此要把最新的lxc安装到/usr/bin目录下,或者安装后cp到/usr/bin/下。

   三、从新挂载cgroup。

   cgroup会默认采用“多挂载点”方式,并开机启动,因此首先禁用相应服务cgconfig,操做以下:

sudo service cgconfig stop
sudo chkconfig cgconfig off

   而后采用“单挂载点方式”从新挂载cgroup。能够直接手动挂载,这样当次挂载成功。

mount -t cgroup none /cgroup

   也能够编辑/etc/fstab/,以后每次开机后都会自动挂载。输入下列内容,重启就OK了。

none  /cgroup  cgroup  defaults  0 0

   在Redhat/Centos环境下安装Docker的具体方法,也可参见本人的另外一篇博客《在Redhat/Centos下安装Docker(不升级内核)

相关文章
相关标签/搜索