1、LXC的简介
1.1、 Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
1.2、LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:
(1)与宿主机使用同一个内核,性能损耗小;
(2)不需要指令级模拟;
(3)不需要即时(Just-in-time)编译;
(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(5)避免了准虚拟化和系统调用替换中的复杂性;
(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
总结:Linux Container是一种轻量级的虚拟化的手段。
1.3、LXC与docker的关系
(1)Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
(2)在LXC的基础之上,Docker提供了一系列更强的功能。
2、LXC的安装
2.1、安装lxc 和 lxc 自带的模板包
yum -y install lxc lxc-templates
[root@zxomc yum.repos.d]# yum -y install lxc lxc-templates
已加载插件:fastestmirror, refresh-packagekit, security
设置安装进程
Repository epel is listed more than once in the configuration
Loading mirror speeds from cached hostfile
解决依赖关系
--> 执行事务检查
---> Package lxc.x86_64 0:1.0.11-1.el6 will be 安装
--> 处理依赖关系 lua-lxc(x86-64) = 1.0.11-1.el6,它被软件包 lxc-1.0.11-1.el6.x86_64 需要
--> 处理依赖关系 lua-alt-getopt,它被软件包 lxc-1.0.11-1.el6.x86_64 需要
--> 处理依赖关系 liblxc.so.1()(64bit),它被软件包 lxc-1.0.11-1.el6.x86_64 需要
---> Package lxc-templates.x86_64 0:1.0.11-1.el6 will be 安装
--> 执行事务检查
---> Package lua-alt-getopt.noarch 0:0.7.0-1.el6 will be 安装
---> Package lua-lxc.x86_64 0:1.0.11-1.el6 will be 安装
--> 处理依赖关系 lua-filesystem,它被软件包 lua-lxc-1.0.11-1.el6.x86_64 需要
---> Package lxc-libs.x86_64 0:1.0.11-1.el6 will be 安装
--> 执行事务检查
---> Package lua-filesystem.x86_64 0:1.4.2-1.el6 will be 安装
--> 完成依赖关系计算
依赖关系解决
=================================================================================================================================================================================
软件包 架构 版本 仓库 大小
=================================================================================================================================================================================
正在安装:
lxc x86_64 1.0.11-1.el6 epel 124 k
lxc-templates x86_64 1.0.11-1.el6 epel 82 k
为依赖而安装:
lua-alt-getopt noarch 0.7.0-1.el6 epel 6.9 k
lua-filesystem x86_64 1.4.2-1.el6 epel 24 k
lua-lxc x86_64 1.0.11-1.el6 epel 16 k
lxc-libs x86_64 1.0.11-1.el6 epel 257 k
事务概要
=================================================================================================================================================================================
Install 6 Package(s)
总下载量:510 k
Installed size: 1.3 M
下载软件包:
(1/6): lua-alt-getopt-0.7.0-1.el6.noarch.rpm | 6.9 kB 00:00
(2/6): lua-filesystem-1.4.2-1.el6.x86_64.rpm | 24 kB 00:00
(3/6): lua-lxc-1.0.11-1.el6.x86_64.rpm | 16 kB 00:00
(4/6): lxc-1.0.11-1.el6.x86_64.rpm | 124 kB 00:00
(5/6): lxc-libs-1.0.11-1.el6.x86_64.rpm | 257 kB 00:00
(6/6): lxc-templates-1.0.11-1.el6.x86_64.rpm | 82 kB 00:00
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
总计 469 kB/s | 510 kB 00:01
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
正在安装 : lxc-libs-1.0.11-1.el6.x86_64 1/6
/sbin/ldconfig: /lib/libuuid.so.1 不是符号连接
/sbin/ldconfig: /lib/libext2fs.so.2 不是符号连接
/sbin/ldconfig: /lib/libattr.so.1 不是符号连接
/sbin/ldconfig: /lib/libpamc.so.0 不是符号连接
/sbin/ldconfig: /lib/libvolume_id.so.0 不是符号连接
/sbin/ldconfig: /lib/libaudit.so.0 不是符号连接
/sbin/ldconfig: /lib/libacl.so.1 不是符号连接
/sbin/ldconfig: /lib/libdbus-1.so.3 不是符号连接
/sbin/ldconfig: /lib/libgmodule-2.0.so.0 不是符号连接
/sbin/ldconfig: /lib/libasound.so.2 不是符号连接
/sbin/ldconfig: /lib/libtermcap.so.2 不是符号连接
/sbin/ldconfig: /lib/libauparse.so.0 不是符号连接
/sbin/ldconfig: /lib/libblkid.so.1 不是符号连接
/sbin/ldconfig: /lib/libgobject-2.0.so.0 不是符号连接
/sbin/ldconfig: /lib/libpam_misc.so.0 不是符号连接
/sbin/ldconfig: /lib/libe2p.so.2 不是符号连接
/sbin/ldconfig: /lib/libpam.so.0 不是符号连接
/sbin/ldconfig: /lib/libss.so.2 不是符号连接
/sbin/ldconfig: /lib/libexpat.so.0 不是符号连接
/sbin/ldconfig: /lib/libcom_err.so.2 不是符号连接
/sbin/ldconfig: /lib/libgthread-2.0.so.0 不是符号连接
/sbin/ldconfig: /lib/libwrap.so.0 不是符号连接
/sbin/ldconfig: /lib/libcap.so.1 不是符号连接
/sbin/ldconfig: /lib/libglib-2.0.so.0 不是符号连接
正在安装 : lua-filesystem-1.4.2-1.el6.x86_64 2/6
正在安装 : lua-lxc-1.0.11-1.el6.x86_64 3/6
正在安装 : lua-alt-getopt-0.7.0-1.el6.noarch 4/6
正在安装 : lxc-1.0.11-1.el6.x86_64 5/6
正在安装 : lxc-templates-1.0.11-1.el6.x86_64 6/6
Verifying : lxc-1.0.11-1.el6.x86_64 1/6
Verifying : lua-lxc-1.0.11-1.el6.x86_64 2/6
Verifying : lxc-libs-1.0.11-1.el6.x86_64 3/6
Verifying : lxc-templates-1.0.11-1.el6.x86_64 4/6
Verifying : lua-alt-getopt-0.7.0-1.el6.noarch 5/6
Verifying : lua-filesystem-1.4.2-1.el6.x86_64 6/6
已安装:
lxc.x86_64 0:1.0.11-1.el6 lxc-templates.x86_64 0:1.0.11-1.el6
作为依赖被安装:
lua-alt-getopt.noarch 0:0.7.0-1.el6 lua-filesystem.x86_64 0:1.4.2-1.el6 lua-lxc.x86_64 0:1.0.11-1.el6 lxc-libs.x86_64 0:1.0.11-1.el6
完毕!
2.2、检测环境
lxc-checkconfig :此命令用于检测当前系统配置是否满足创建 container的要求,如果输出所有项均为enbale状态,则表明内核支持lxc容器,否则需重新编译内核打开相应功能项。具体如何编译内核此文暂不涉及,有需要的可以网上找其他文献。
lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.10.5-3.el6.x86_64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: missing
Network namespace: enabled
Multiple /dev/pts instances: enabled
--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled
--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
Bridges: enabled
Advanced netfilter: enabled
CONFIG_NF_NAT_IPV4: enabled
CONFIG_NF_NAT_IPV6: enabled
CONFIG_IP_NF_TARGET_MASQUERADE: enabled
CONFIG_IP6_NF_TARGET_MASQUERADE: enabled
CONFIG_NETFILTER_XT_TARGET_CHECKSUM: enabled
--- Checkpoint/Restore ---
checkpoint restore: missing
CONFIG_FHANDLE: enabled
CONFIG_EVENTFD: enabled
CONFIG_EPOLL: enabled
CONFIG_UNIX_DIAG: enabled
CONFIG_INET_DIAG: enabled
CONFIG_PACKET_DIAG: enabled
CONFIG_NETLINK_DIAG: enabled
File capabilities: enabled
Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
2.3创建一个名为myContainer的容器,模板名称为/usr/share/lxc/template/lxc-centos
# lxc-create -n myContainer -t /usr/share/lxc/template/lxc-centos
# lxc-create -n myContainer -t /usr/share/lxc/template/lxc-centos
lxc_container: utils.c: get_template_path: 1106 No such file or directory - bad template: /usr/share/lxc/template/lxc-centos
lxc_container: lxccontainer.c: lxcapi_create: 1231 bad template: /usr/share/lxc/template/lxc-centos
lxc_container: lxc_create.c: main: 274 Error creating container myContainer
上述错误的主要原因是:没有lx-centos的模板
# lxc-create -n myContainer
A template must be specified.
Use "none" if you really want a container without a rootfs.
[root@zxomc yum.repos.d]# lxc-create -n myContainer -t none
使用 -t none 表示不为此容器创建使用的模板。
2.4创建一个myContainer的容器后,我们可以使用lxc-info -n myContainer命令查看此容器的信息
lxc-info -n myContainer
Name: myContainer
State: STOPPED
新创建的容器位于/var/lib/lxc/ 目录下。
此处需要注意,由于创建容器时没有指定模板,所以创建的容器没有rootfs相关信息。由于模板是一个脚本文件,执行了一系列操作,包括创建容器的时候挂载文件系统,配置网络,安装必要软件,创建用户/属组,设置密码等。所以一旦我们没有指定模板,那么创建的容器便无法正常使用。
2.5 此时使用 lxc-start -n myContainer命令尝试启动一个容器时,会遇到如下错误:
lxc-start -n myContainer
lxc-start: conf.c: instantiate_veth: 3115 failed to attach 'vethLOMVGD' to the bridge 'virbr0': No such device
lxc-start: conf.c: lxc_create_network: 3407 failed to create netdev
lxc-start: start.c: lxc_spawn: 875 failed to create the network
lxc-start: start.c: __lxc_start: 1149 failed to spawn 'myContainer'
lxc-start: lxc_start.c: main: 336 The container failed to start.
lxc-start: lxc_start.c: main: 340 Additional information can be obtained by setting the --logfile and --logpriority options.
上述错误的主要原因是没有virbr0网桥。
解决上述错误的方法时创建此virbr0网桥,具体方法如下:
(A)下包
# yum install bridge-utils -y
(B)查看网桥信息
# brctl show
(C)创建virbr0 网桥
# brctl addbr virbr0
(D)查看网桥创建成功
# ip a |grep virbr0
(E)激活网桥
# ip link set dev virbr0 up
# ip a 查询是否激活
(F)配置网桥地址
# ip addr add 10.1.0.1/24 dev virbr0
2.6 lxc的简单命令
(1)lxc-checkconfig:
检查系统环境是否满足容器使用要求;
(2)lxc-create:创建lxc容器;
lxc-create -n name [-f config_file] [ -t template]
创建一个系统对象来存储配置和用户信息,该对象保存/var/lib/lxc(注意该目录为版本相关的,不同版本的lxc可能不同)目录下,name为其标示符。如果配置文件未指定,则系统会支持默认的资源隔离:PID,sysv IPC和挂载点。
默认创建的config文件的内容:
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
(3)lxc-start:启动容器;
lxc-start -n NAME
(4)lxc-stop:停止容器;(停止命令很慢)
lxc-stop -n NAME
关闭一个容器。与lxc-start类似,要stop的容器必须是已经lxc-create并且lxc-start的
(5)lxc-info:查看容器相关的信息;
lxc-info -n NAME
(6)lxc-destory:删除处于停机状态的容器;
彻底删除一个容器,与之相关的一切数据都不可用
(7)lxc-snapshot:创建和恢复快照;
(8)冻结该容器所有的进程。进程会被锁定,直到lxc-unfreeze进行解锁。
lxc-freeze -n name
(9)用于解除被lxc-freeze冻结的容器进程。
lxc-unfreeze -n name