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要大很多。

官方给出的LXC未来的目标是:

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.

1.1  LXC与docker的关系

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

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

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

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

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

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

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

组件重用。任何容器都可以用作“基础图像”来创建更专业的组件。这可以手动完成或作为自动构建的一部分。例如,您可以准备理想的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多了些什么

LXC容器的更多相关文章

  1. 如何在Ubuntu上创建及管理LXC容器?

    将LXC安装到Ubuntu上 $ sudo apt-get install lxc 安装完毕之后,运行lxc-checkconifg工具,检查当前Linux内核支持LXC的情况.要是一切都已被启用,内 ...

  2. lxc 容器基础配置篇

    一, 首先配置lxc需要的网卡断 吧eth0复制一份变为br0 配置br0 配置eth0 重启网卡   /etc/init.d/network restart 安装lxc软件 需要epel源--- y ...

  3. Lxc容器基本用法

    你将学到什么 如何安装LXC 如何创建LXC容器 如何管理LXC容器 如何查询进程所属Namespace 如何给LXC容器添加网卡 如何限制LXC容器资源 环境 x64 Ubuntu 14.04.3 ...

  4. 生成Alpine LXC容器的根文件系统

    一个Alpine LXC容器的文件系统内容包括以下内容 根文件系统 应用程序,库文件以及配置文件 根文件系统主要包含alpine linux最小系统所需要的组件.下面主要讲一下制作根文件系统的方法. ...

  5. lxc.conf解析&lxc容器能力

    lxd启动容器实际是生成lxc.conf.剩下的就是LXC对容器进行控制了.所以可认为lxc.conf就是lxd和lxc之间主要的接口.lxc.conf详细属性参考: http://manpages. ...

  6. 在Ubuntu16.04上部署LXC容器管理系统的相关步骤

    打算安装一个LXC linux容器管理的软件来分配使用资源并配置不同的编程环境,这样就方便大家的使用,步骤如下(宿主机的环境都搭建好了,对应显卡的驱动等): 参考网站: 简单入门和相关指令总结:htt ...

  7. LXC 容器集chroot使用说明

    1.1 LXC是什么? 1.1.1 关于LXC LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level vi ...

  8. 一条命令停止所有lxc容器,删除所有lxc容器

    for i in $(virsh -c lxc:/// list | grep -v 'Id' | awk '{print $2}');do virsh -c lxc:/// destroy ${i} ...

  9. LXC容器文件系统设计优化

    在HOST上面,一个LXC container包含一个config文件和一个rootfs目录. 早期我们在交叉编译系统上编译出container的rootfs之后,直接在编译系统上将其用tar压缩打包 ...

随机推荐

  1. Qt 一张图片显示在其他组件之上

    图片放在QLabel上,注意设置QLable一些属性 QImage img("test.png"); img = img.scaledToWidth(,Qt::SmoothTran ...

  2. vue-cli3用图形化的方式创建项目

    Vue脚手架可以快速生成Vue项目基础的架构. A.安装3.x版本的Vue脚手架: npm install -g @vue/cli B.基于3.x版本的脚手架创建Vue项目: 1).使用命令创建Vue ...

  3. JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

    JobStorage.Current property value has not been initialized. You must set it before using Hangfire Cl ...

  4. 学习 Git Rebase

    有问题为什么不问问神奇的 man 呢? rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档.这份文 ...

  5. excel 去掉 空单元格

    Excel 2003 选中这一列,定位(CTRL+G)--定位条件--空值--确定--右键--删除. 1. 然后进行全选已输入的内容,可以使用鼠标拖动已输入的内容,也可以使用快捷键全选内容,按住ctr ...

  6. centos7 spark2.3.1集群搭建

    1.安装jdk 2.安装scala 参照jdk的安装 3.ssh 免密码登录 4.安装hadoop 以上四步请参照   centos7 安装hadoop2.7.6(分布式) 5.安装spark  1) ...

  7. linux配置ssh免密钥登录

    https://blog.csdn.net/xiaoyi23000/article/details/80597516 1.执行命令ssh-keygen -t rsa,生成公钥和私钥 2.会在当前用户的 ...

  8. [转帖]java中的for循环

    java中的for循环 https://baijiahao.baidu.com/s?id=1621622990642364099&wfr=spider&for=pc 发现自己连 for ...

  9. SSM整合学习 四

    事务管理 一:初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个 ...

  10. Oracle Round 函式 (四捨五入)

    Oracle Round 函式 (四捨五入)描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果.SELECT ROUND( number, [ decimal_places ] ...