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(主要是源下载时间长)。

参考:

lxc mysql 使用_LXC容器相关推荐

  1. 详解使用DockerHub官方的mysql镜像生成容器

    为什么80%的码农都做不了架构师?>>>    写在前面:看到网上关于利用DockerHub官方的mysql镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教. 我 ...

  2. mysql apache php 容器_docker 容器的使用[php 5.6 mysql5.7]

    需要启动systemd进程 --privileged[需要启动systemctl] docker run --privileged -tdi -p 8080:80 centos7-sshd-httpd ...

  3. 在 CentOS 8 上使用 LXC / LXD 运行 Linux 容器

    揭秘 LXC Linux 容器项目 (LXC) 是一个开源容器平台,提供了一组工具.模板.库和语言绑定.它提供的容器包括一个完整的 Linux 系统,就像一个 VM,有自己的文件系统.网络和多个应用程 ...

  4. 如何在Mysql的Docker容器启动时初始化数据库

    1.前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. ...

  5. docker导入MySQL文件_Docker容器中Mysql数据的导入/导出详解

    前言 Mysql数据的导入导出我们都知道一个mysqldump命令就能够解决,但如果是运行在docker环境下的mysql呢? 解决办法其实还是用mysqldump命令,但是我们需要进入docker的 ...

  6. docker mysql 日志_docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法...

    今天利用docker容器创建mysql8.0的时候(window系统),指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了. 创建命令: $ docker run -d ...

  7. mysql容器操作_如何使用运行MySQL构建Docker容器?

    我的目标是拥有一个具有运行MySQL服务的docker容器.所以每当我启动容器时,数据库都处于初始状态并且MySQL正在运行. 几乎一切都很好但是当我启动容器时MySQL服务没有运行.每次在控制台中我 ...

  8. docker mysql数据库初始化_如何在Mysql的Docker容器启动时初始化数据库

    1.前言 Docker在开发中使用的越来越多了,最近搞了一个Spring Boot应用,为了方便部署将Mysql也放在Docker中运行.那么怎么初始化 SQL脚本以及数据呢? 我这里有两个传统方案. ...

  9. mysql中error22_docker中将MySQL运行在容器中失败提示“ InnoDB : Error 22 with aio_write”的解决办法...

    今天利用docker容器创建 mysql 8.0的时候,指定了本地宿主机器的一个目录为容器mysql的datadir目录,发现创建失败了. 创建命令: $ docker run -d --name m ...

最新文章

  1. RPC-原理及RPC实例分析
  2. muduo之TcpServer
  3. css怎样将图片设置成正方形,而且随着浏览器窗口大小的改变而自适应缩放
  4. 鸿蒙系统8xmax,华为8月9日发布基于安卓10.0全新系统:自主鸿蒙会同台亮相
  5. Zookeeper核心工作机制(zookeeper特性、zookeeper数据结构、节点类型)
  6. 用JUnit框架实现Java单元测试
  7. 前端高效开发必备的 js 库梳理
  8. error PRJ0003 : 生成“cl.exe”时出错 解决方案
  9. 单向队列、双端队列、栈的模型实现
  10. 6s电路图纸 iphone_(分享)iphone6s原理图、点位图(维修必备)
  11. 图像分类模型的学习笔记
  12. TonglinkQ8基于linux 7.5的安装
  13. c语言初步经典题4----求圆柱体的表面积
  14. 《钱塘湖春行》-----白居易
  15. 信息学奥赛一本通:1041:奇偶数判断
  16. 研究生毕业论文如何选题
  17. MAC使用 SVN问题
  18. 如何将自己的代码上传到github
  19. PHP_基础学习(10)
  20. 使用scrapy爬取指定内容相关的百度图片

热门文章

  1. 【JY】Abaqus案例—天然橡胶隔震支座竖(轴)向力学性能
  2. STUN和TURN技术
  3. 什么是node-gyp?
  4. c#下实现ping操作【转】
  5. 自制微信小程序popover菜单
  6. py2to3--将python2项目转成python3项目
  7. SQL CREATE TABLE
  8. 物联网实训总结——简易的智能农场
  9. 一文说透模拟退火算法
  10. 北京市两限房管理办法揭秘