LXC容器

1.    LXC简述

Linux container是一种资源隔离机制而非虚拟化技术。VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是标准的虚拟化技术,这种技术经过虚拟层(也就是VMM或叫Hypervisor),主要做用一是让多个操做系统和应用共享硬件资源, 其二是把上层虚拟机的指令转换成底层Host操做系统所认识的指令,这就意味着在Linux上能够跑windows系统,container技术介于chroot和VM之间,其“虚拟机”和主机操做系统相同或很相似,即Linux下均是Linux架构的,没有安装windows虚拟机的。cgroup就是一个资源限制器,没有提供隔离功能,真正的隔离功能内核使用namespace实现的,这就意味着cgroup资源限制的模块间影响比container要大不少。html

官方给出的LXC将来的目标是:python

The goal of LXC is to create an environment as close as possible as a standard Linux installation but without the need for a separate kernel.mysql

1.1  LXC与docker的关系

LXC将Linux进程沙盒化,使得进程之间相互隔离,而且可以控制各进程的资源分配。lxc 用容器的方式仿真了一个相似虚拟机的操做体验,并避免了虚拟机额外的系统负载。lxc利用cgroup和namespace在linux应用层建立了一个“虚拟机”(隔离的裸露文件系统),没法有效支持跨主机之间的容器迁移、管理复杂(lxd解决了这些问题)。lxc和docker不一样地方在于lxc包含完整的操做系统,是一个系统容器。linux

Docker的底层使用了LXC来实现的,但docker对lxc封装,提供了更好的操做性和移植性。Docker容器将应用和其依赖环境所有打包到一个单一对象中,在不包含完整的操做系统的状况下就能运行普通应用,更加轻量级,可移植性更好。因此它成为了PaaS(好比Kubernates)平台的基石。git

除了lxc底层基础以外,Docker还提供了一个具备如下强大功能的高级工具:redis

跨机器的便携式部署。 Docker定义了一种将应用程序及其全部依赖绑定到一个单独对象中的格式,该对象能够被传输到任何启用docker的机器上,并在那里执行,保证暴露给应用程序的执行环境是相同的。 Lxc实现了流程沙盒,这是便携式部署的重要先决条件,但单靠这一点对于便携式部署来讲是不够的。若是您向我发送了一个安装在自定义lxc配置中的应用程序的副本,那么它几乎确定不会像咱们的机器那样在您的机器上运行,由于它与您计算机的特定配置有关:网络,存储,日志记录,发行版,等等。Docker为这些特定于机器的设置定义了一个抽象,以便彻底相同的docker容器能够在许多不一样的机器上运行,即便不一样主机具备许多不一样的配置。sql

以应用为中心。 Docker针对应用程序的部署进行了优化,而不是机器。这反映在其API,用户界面,设计理念和文档。相比之下,lxc助手脚本将容器做为轻量级的机器 - 基本上是启动速度更快,内存更少的服务器。咱们认为容器不止于此。docker

自动构建。 Docker包含一个工具,供开发人员自动从源代码中组装一个容器,彻底控制应用程序的依赖关系,构建工具,打包等。他们能够自由使用make,maven,chef,puppet,salt,debian包,rpms,source tarballs,或上述的任何组合,而无论机器的配置如何。shell

版本追溯。Docker包括用于跟踪容器的连续版本,检查版本之间的差别,提交新版本,回滚等相似git的功能。历史记录还包括如何组装一个容器以及由谁来完成,所以您能够从生产服务器一路回到上游开发商。 Docker也实现增量上传和下载,相似于“git pull”,因此新版本的容器只能经过发送差别来传输。ubuntu

组件重用。任何容器均可以用做“基础图像”来建立更专业的组件。这能够手动完成或做为自动构建的一部分。例如,您能够准备理想的python环境,并将其用做10个不一样应用程序的基础。您理想的postgresql设置能够从新用于您全部的将来项目。

共享。 Docker能够访问一个公共注册表(http://index.docker.io),成千上万的用户上传了有用的容器:从redis,couchdb,postgres到irc保险箱到rails应用服务器,以便为各类发行版本建立基础映像。登记处还包括由码头工做组维护的有用容器的官方“标准库”。注册表自己是开源的,因此任何人均可以部署他们本身的注册表来存储和传输私有容器,例如用于内部服务器部署。

工具生态系统。Docker定义了一个用于自动化和自定义容器的建立和部署的API。有大量的工具与docker集成来扩展其功能。 (Dokku,Deis,Flynn),多节点编排(maestro,salt,mesos,openstack nova),管理仪表板(docker-ui,OpenStack Horizo​​n,造船厂),配置管理(厨师,puppet),持续集成(jenkins,strider,travis)等。Docker正在迅速将本身定位为基于容器的工具的标准。

2. 经常使用命令

2.1 经常使用操做命令

LXC能够建立两种不一样的容器:

  • · 特权模式--以root身份运行各类lxc命令,建立特权容器;
  • · 普通模式--以普通用户身份运行各类lxc命令,建立非特权容器

普通容器又不少限制(好比没法建立设备节点),不过也更安全(不会危害到主机),由于这种容器的root用户,其实映射到主机上的一个普通用户。

1. lxc-checkconfig:检查系统环境是否知足容器使用要求。

2. lxc-create:建立lxc容器;

lxc-create -n NAME -t TEMPLATE_NAME

3. lxc-start:启动容器;

lxc-start -n foo [-f config] /bin/bash

lxc-start -n NAME -d

-d守护进程方式启动容器。若是没有指定命令,lxc-start将运行/sbin/init。

lxc-create建立的容器,在中止运行后须要使用lxc-destroy销毁。

4. lxc-execute:执行命令

lxc-execute -n foo [-f config] /bin/bash

lxc-execute经过中间进程lxc-init使命令在容器中运行。

若是容器不存在,lxc-execute会自动建立一个,中止运行后会被自动销毁。

lxc-execute启动应用程序,配置优先级以下:

若是执行-f选项,那么以前建立容器的配置文件不会被使用。若是指定-s选项,则在命令行中配置的键值对会覆盖配置文件(不管以前的仍是-f指定的)的相同配置。

5. lxc-stop:中止容器;(中止命令很慢)

lxc-stop -n NAME -d

6. lxc-destory:删除处于停机状态的容器;

lxc-destroy -n NAME

7. lxc-info:查看容器相关的信息;

lxc-info -n NAME

8. lxc-ls:列出容器

lxc-ls --fancy 列出详细信息

9. lxc-monitor:监控容器

lxc-monitor -n "foo|bar"

lxc-monitor -n ".*"   ;监控全部容器

当一个容器的状态变化时,lxc-monitor会在屏幕上打印出容器的状态。

10. lxc-wait:监听容器特定状态后退出

lxc-wait -n foo -s STOPPED &

11. lxc-cgroup:设置或获取与cgroup相关的参数(control group subsystem)

lxc-cgroup -n foo cpuset.cpus

lxc-cgroup -n foo cpu.shares 512

11. lxc-snapshot:建立和恢复快照;

2.2 进入容器

进入容器的方式有三种:lxc-attach、lxc-console、和SSH.

1. lxc-attach

lxc-attach -n Name

lxc-attach -n Name -- command

提高特权,并指定名字空间,在测试主机上软件时颇有用:

lxc-attach -n ubuntu1 -e -s 'NETWORK|UTSNAME'

2. lxc-console

lxc-console -n Name 登陆容器,须要用户名和密码

3. ssh

ssh 用户名@IP

2.3 克隆容器

"克隆"要么是其余容器的一份拷贝,要么是其余容器的一份快照。

拷贝:完整的复制原来的容器,所占的空间和原来的容器同样大

快照:利用后台文件系统的快照功能,建立一个很小的新容器,在发生写操做时才进行复制

要想使快照拥有这个写时复制的特性,须要一个特殊存储系统,支持快照的存储方式有:aufs,btrfs,LVM,overlayfs,zfs等,每种存储方式各有本身特色。

lxc-clone用于建立拷贝和快照,在建立以前须要中止容器:

sudo lxc-stop -n Name

sudo lxc-copy -n Name -N clone_Name    ;拷贝

sudo lxc-copy -s -n Name -N snapshot_Name   ;快照

sudo lxc-snapshot -n Name { -r snapshot_Name -N nawName;建立快照或恢复

建立的快照位于/var/lib/lxc/容器名目录下,快照名字为snap0,snap1…

3. 安装

1. 安装lxc 和lxc 自带的模板包

sudo add-apt-repository ppa:ubuntu-lxc/lxc-stable

sudo apt-get update

sudo apt install lxc lxc-templates  

2. 添加网桥

lxc不会处理容器网络,须要配置网络(在Ubuntu下经过apt安装的话,网桥已经配置好)。

sudo apt install bridge-utils -y

brctl addbr virbr0  #添加网桥

brctl addif virbr0 ens33 ; # 将网桥关联到ens33这个网卡 \

ip addr del dev ens33 192.168.253.128/24 ; #把网卡上的ip删了 \

ifconfig  virbr0 192.168.253.128/24 up  #给网桥配置ip \

route add default gw 192.168.253.2 #设置默认网关

4.  LXC模板

所谓的模板就是一个原型,依据该原型能够建立一系列相似的LXC虚拟机,若是使用lxc自带的模板,那么该原型只提供最基本的配置,若是想使用vim,gcc,mysql须要本身制做。这里所说的模板制做,只是一个比较简单的最基础的制做,有点相似嵌入式系统的最小系统的概念,只保留最最基本的应用,在这基础之上,添加相应的应用。

模板就是建立容器的脚本,包含容器中各类源(或组件)地址及下载和一步步制做容器的方法,本质就是shell脚本。

建立ubuntu容器后,容器文件系统目录以下:

 

建立Ubuntu的lxc容器日志,生成时间超过30min(主要是源下载时间长)。

 

参考:

1. https://linuxcontainers.org/ 官网

2. Docker系列02—LXC---Docker的“前身”

3. LXC简单介绍与使用

4. LXC之三--建立模板

5. 最佳虚拟容器LXC

6. docker到底比LXC多了些什么

相关文章
相关标签/搜索