Linux Note – Container初窥

Linux Container是一个操作系统层的轻量级虚拟化技术,百度、腾讯等互联网公司的PaaS平台大多都采用了这项新技术。和XEN,VMware和KVM等硬件抽象层的虚拟化技术相比,LXC更像是加强版的chroot。因为Linux Containers不但没有对硬件设备进行仿真(指令集模拟),还可以使用主机的目录和文件等资源。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。所以,与传统的HAL(硬件抽象层)层次的虚拟化技术相比有以下优势:a). 更小的虚拟化开销。LXC的诸多特性基本由内核特供,相当于一个加强版的chroot,开销相比HAL的虚拟化小了很多。b). 快速部署。利用LXC来隔离特定应用,只需要安装LXC,即可使用LXC相关命令来创建并启动容器来为应用提供虚拟执行环境。传统的虚拟化技术则需要先创建虚拟机,然后安装系统,再部署应用。 LXC项目本身只是一个用户空间的工具集(Userspace tools for the Linux Kernel containers),用来使用和管理LXC容器。LXC在资源管理方面依赖与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架(参见我之前的一篇文章之前的cgroup简介),可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。

1. 安装LXC

安装rpel

[root@localhost ~]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmRetrieving http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpmPreparing...                ########################################### [100%]   1:epel-release           ########################################### [100%]

安装cgroup,lxc和lxc模版

[root@localhost ~]# yum install libcgroup lxc lxc-templates......Installed:  lxc.x86_64 0:0.9.0-2.el6          lxc-templates.x86_64 0:0.9.0-2.el6         Dependency Installed:  cvs.x86_64 0:1.11.23-16.el6          debootstrap.noarch 0:1.0.59-1.el6         dpkg.x86_64 0:1.15.5.6-6.el6         gettext.x86_64 0:0.17-16.el6              lxc-libs.x86_64 0:0.9.0-2.el6       Complete!

检查lxc运行环境:

Kernel configuration not found at /proc/config.gz; searching...Kernel configuration found at /boot/config-2.6.32-431.el6.x86_64--- Namespaces ---Namespaces: enabledUtsname namespace: enabledIpc namespace: enabledPid namespace: enabledUser namespace: enabledNetwork namespace: enabledMultiple /dev/pts instances: enabled--- Control groups ---Cgroup: enabledCgroup namespace: enabledCgroup device: enabledCgroup sched: enabledCgroup cpu account: enabledCgroup memory controller: enabledCgroup cpuset: enabled--- Misc ---Veth pair device: enabledMacvlan: enabledVlan: enabledFile capabilities: enabledNote : Before booting a new kernel, you can check its configurationusage : CONFIG=/etc/lxc/default.conf  /usr/bin/lxc-checkconfig

2. 创建容器实例(1). 创建sshd模版的容器

在CentOS中,LXC的几个默认的路径如下:lxc默认配置文件:/etc/lxc/default.conf 模版脚本所在目录:/usr/share/lxc/templates 容器实例目录:/var/lib/lxc/ 首先创建一个名为sshd-server的简单的sshd容器:

# lxc-create -n sshd-server -t sshdlxc-create: No config file specified, using the default config /etc/lxc/default.confGenerating public/private rsa key pair.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /var/lib/lxc/sshd-server/rootfs/etc/ssh/ssh_host_rsa_key.Your public key has been saved in /var/lib/lxc/sshd-server/rootfs/etc/ssh/ssh_host_rsa_key.pub.The key fingerprint is:68:04:67:7c:9c:b1:da:ec:95:ec:d5:22:8d:14:9f:ad root@localhostThe key's randomart image is:+--[ RSA 2048]----+|    ..o..o.      ||     +. +. o o   ||      ... . o .  ||     . = o + o   ||      + S * E .  ||     . . o o .   ||        . .      ||                 ||                 |+-----------------+Generating public/private dsa key pair.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /var/lib/lxc/sshd-server/rootfs/etc/ssh/ssh_host_dsa_key.Your public key has been saved in /var/lib/lxc/sshd-server/rootfs/etc/ssh/ssh_host_dsa_key.pub.The key fingerprint is:7e:fb:bf:3f:25:e3:d1:70:af:a8:e1:83:a0:03:00:d4 root@localhostThe key's randomart image is:+--[ DSA 1024]----+|...              ||.  E             ||.                ||.             . .|| .      S      +.||  .   ..      + +||   . . ...o  o =.||    o   .o.o. o. ||     .    ++..ooo|+-----------------+'sshd' template installed'sshd-server' created

检查容器所在的目录,里面已经有了对应的目录结构。简单的一条命令,这台“虚拟机”就创建成功了。

[root@localhost rootfs]# pwd/var/lib/lxc/sshd-server/rootfs[root@localhost rootfs]# lltotal 52drwxr-xr-x. 2 root root 4096 May 22 00:17 bindrwxr-xr-x. 3 root root 4096 May 22 00:17 devdrwxr-xr-x. 3 root root 4096 May 22 00:17 etcdrwxr-xr-x. 2 root root 4096 May 22 00:17 homedrwxr-xr-x. 2 root root 4096 May 22 00:17 libdrwxr-xr-x. 2 root root 4096 May 22 00:17 lib64drwxr-xr-x. 2 root root 4096 May 22 00:17 procdrwxr-xr-x. 2 root root 4096 May 22 00:17 rootdrwxr-xr-x. 3 root root 4096 May 22 00:17 run-rw-r--r--. 1 root root    0 May 22 00:17 run-dhcpdrwxr-xr-x. 2 root root 4096 May 22 00:17 sbindrwxr-xr-x. 2 root root 4096 May 22 00:17 tmpdrwxr-xr-x. 2 root root 4096 May 22 00:17 usrdrwxr-xr-x. 5 root root 4096 May 22 00:17 var# find .  -type f./etc/group./etc/passwd./etc/ssh/ssh_host_rsa_key./etc/ssh/ssh_host_dsa_key.pub./etc/ssh/ssh_host_rsa_key.pub./etc/ssh/ssh_host_dsa_key./etc/ssh/sshd_config./run-dhcp

该容器的root目录下只包含了sshd服务所需的配置文件,这些都是由模版脚本定制的。

(2). 安装新模版

下面添加新的CentOS模版,打开github(https://github.com/fajarnugraha/lxc/blob/centos-template/templates/lxc-centos.in),下载这个模版脚本并保存到/usr/share/lxc/templates/lxc-centos中打开lxc-centos,我们看到这个脚本预定义的几个配置变量。对其进行修改:root_password=debugolxc_network_type=vethlxc_network_link=virbr0为这个模版脚本添加执行权限

chmod +x /usr/share/lxc/templates/lxc-centos

使用centos模版创建一个名为centos的VM( 如果模版脚本没有在默认目录中,需要使用-f指定路径名)

lxc-create -n centos -t centos ......#使用yum安装相关依赖......'centos' template installed'centos' created

(3). 配置虚拟化网络

接下来为了能使用虚拟化网络,需要安装虚拟化组件。

[root@localhost rootfs]# yum groupinstall "Virtualization" "Virtualization Client" “virtualization-platform”......[root@localhost rootfs]# reboot

重启后进入图形界面,进入KVM的VM manager

[debugo@localhost ~]$ virt-manager

Edit -> Connection可以看到系统已经默认建立了一个bridge,而且已经通过dnsmasq启动了dhcp。

[root@localhost sshd-server]# ps -ef | grep dnsmasq | grep -v grepnobody    2225     1  0 01:35 ?        00:00:00 /usr/sbin/dnsmasq --strict-order --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --bind-interfaces --listen-address 192.168.122.1 --dhcp-range 192.168.122.2,192.168.122.254 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases --dhcp-lease-max=253 --dhcp-no-override --dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts

打开sshd-server的container配置文件

vim /var/lib/lxc/sshd-serverlxc.network.type = vethlxc.network.link = virbr0lxc.network.flags = up# adding lineslxc.network.name = eth0lxc.network.ipv4 = 0.0.0.0

关于网络的配置:lxc.network.type指定用于容器的网络类型:a). empty 新的网络空间会为容器建立,但是没有任何网络接口b). veth 新的网络空间会为容器建立,容器将链接到lxc.network.link定义的网桥上,从而与外部通信。网桥必须在预先建立。c). macvlan 新的网络空间会为容器建立,一个macvlan的接口会链接到lxc.network.link上。d). phys 新的网络空间会被建立,然后lxc.network.link指定的物理接口会被分配给容器lxc.network.hwaddr 用于指定容器的网络接口的mac地址lxc.network.ipv4 用于指定容器的网络接口的ipv4地址,如果不设置或者设为0.0.0.0则表示,容器将通过dhcp的方式获得ip地址

(4). 启动容器

对于已创建好的容器,直接执行lxc-start -n centos命令就可以启动它

[root@localhost centos]# lxc-start -n centos......CentOS release 6.5 (Final)Kernel 2.6.32-431.el6.x86_64 on an x86_64centos login: rootPassword: Would you like to enter a security context? [N]  NLast login: Thu May 22 07:53:16 on tty1[root@centos ~]# ls[root@centos ~]# pwd/root

或者使用lxc-console来连接到这个容器上(终端方式)lxc-console -n centos

(5). 配置容器的cgroup

设置容器只使用0,1两个CPU核心lxc-cgroup -n centos cpuset.cpus 0-1 设置容器使用的CPU时间设置虚拟机可用内存为512Mlxc-cgroup -n centos memory.limit_in_bytes 53687091 设置虚拟机消耗的IO权重lxc-cgroup -n centos blkio.weight 500 或者直接写入容器的配置文件config中。

(6). 关闭并删除容器

直接stop并destory该容器即可,对应的rootfs也会被删除。对于已创建好的容器,直接执行lxc-start -n centos命令就可以启动它

[root@localhost centos]# lxc-stop -n centos[root@localhost centos]# lxc-destory -n centos# ll /var/lib/lxc/centosls: cannot access /var/lib/lxc/centos: No such file or directory

^^

参考

http://linuxcontainers.org

http://www.th7.cn/system/lin/2012/04/16/22603.shtml

http://purplegrape.blog.51cto.com/1330104/1343766

http://www.ibm.com/developerworks/cn/linux/l-lxc-containers/

http://liuyanglongblog.duapp.com/?p=120

Linux Note – Container初窥

相关文章:

你感兴趣的文章:

标签云: