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