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要大很多。
官方给出的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 Horizon,造船厂),配置管理(厨师,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
LXC容器的更多相关文章
- 如何在Ubuntu上创建及管理LXC容器?
将LXC安装到Ubuntu上 $ sudo apt-get install lxc 安装完毕之后,运行lxc-checkconifg工具,检查当前Linux内核支持LXC的情况.要是一切都已被启用,内 ...
- lxc 容器基础配置篇
一, 首先配置lxc需要的网卡断 吧eth0复制一份变为br0 配置br0 配置eth0 重启网卡 /etc/init.d/network restart 安装lxc软件 需要epel源--- y ...
- Lxc容器基本用法
你将学到什么 如何安装LXC 如何创建LXC容器 如何管理LXC容器 如何查询进程所属Namespace 如何给LXC容器添加网卡 如何限制LXC容器资源 环境 x64 Ubuntu 14.04.3 ...
- 生成Alpine LXC容器的根文件系统
一个Alpine LXC容器的文件系统内容包括以下内容 根文件系统 应用程序,库文件以及配置文件 根文件系统主要包含alpine linux最小系统所需要的组件.下面主要讲一下制作根文件系统的方法. ...
- lxc.conf解析&lxc容器能力
lxd启动容器实际是生成lxc.conf.剩下的就是LXC对容器进行控制了.所以可认为lxc.conf就是lxd和lxc之间主要的接口.lxc.conf详细属性参考: http://manpages. ...
- 在Ubuntu16.04上部署LXC容器管理系统的相关步骤
打算安装一个LXC linux容器管理的软件来分配使用资源并配置不同的编程环境,这样就方便大家的使用,步骤如下(宿主机的环境都搭建好了,对应显卡的驱动等): 参考网站: 简单入门和相关指令总结:htt ...
- LXC 容器集chroot使用说明
1.1 LXC是什么? 1.1.1 关于LXC LXC,其名称来自Linux软件容器(Linux Containers)的缩写,一种操作系统层虚拟化(Operating system–level vi ...
- 一条命令停止所有lxc容器,删除所有lxc容器
for i in $(virsh -c lxc:/// list | grep -v 'Id' | awk '{print $2}');do virsh -c lxc:/// destroy ${i} ...
- LXC容器文件系统设计优化
在HOST上面,一个LXC container包含一个config文件和一个rootfs目录. 早期我们在交叉编译系统上编译出container的rootfs之后,直接在编译系统上将其用tar压缩打包 ...
随机推荐
- flutter 打包apk之后,安装在手机上无法访问网络解决方法
</application> <uses-permission android:name="android.permission.READ_PHONE_STATE" ...
- (转)How To Create a Sudo User on Ubuntu
转自:https://linuxize.com/post/how-to-create-a-sudo-user-on-ubuntu/ The sudo command is designed to al ...
- Qt开发经验小技巧61-70
很多人问Qt嵌入式平台用哪个好,这里统一回答(当前时间节点2018年):imx6+335x比较稳定,性能高就用RK3288 RK3399,便宜的话就用全志H3,玩一玩可以用树莓派香橙派. 对于大段的注 ...
- Bladex之Arhcer代码生成器
代码生成器配置: 数据库表准备:Archer中增加对应的表:(参照test_notice和test_notice_list表)主表:SET FOREIGN_KEY_CHECKS=0; -- ----- ...
- RestHighLevelClient查询es
本篇分享的是es官网推荐的es客户端组件RestHighLevelClient的使用,其封装了操作es的crud方法,底层原理就是模拟各种es需要的请求,如put,delete,get等方式:本篇主要 ...
- Zabbix 3.0 配置企业微信报警(配置zabbix-web)
一.添加报警媒体类型 Name:自定义 Type:选择script Scripts name:填写脚本名称 Script parameters:脚本参数 --corpid=XXX --corpsecr ...
- Android Studio使用adb命令连接平板
有需要使用adb命令连接调试平板的同学可以参考下(下面是android官方文档,有点老). http://donandroid.com/how-to-install-adb-interface-dri ...
- 修改IP地址之后认证信息问题
$ ssh lvph@172.16.20.20 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOT ...
- PHP防止刷微信红包方法
PHP防止刷微信红包方法1 输入验证码2授权登陆后 领取红包记录下 openid ip 第二次用openid或者ip(ip)连接同一个路由器是一样的 所以用ip 判断最好是判断有没有6个以上 判断有没 ...
- [bug]—console 在某些机型下的隐藏坑
背景 我们的项目通过重写console对象上的方法实现日志上报的功能,截取代码片段如下: Class Logger() { debug() {}, info() {}, warn() {}, ... ...