2.1、LXC介绍

1、linux container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源

2、LXC为linux container的简写。可以提供轻量级的虚拟化,一遍隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C++中的namespace。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与传统虚拟化技术相比,它的优势在于:

  1)与宿主机使用同一个内核,性能消耗小

  2)不需要指令级模拟

  3)不需要及时(just-in-time)编译

  4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;

  5)避免了准虚拟化和系统调用替换中的复杂性;

  6)轻量级隔离,在隔离的同事还提供共享机制,以实现容器与宿主机的资源共享

  总结:linux container是一种轻量级的虚拟化的手段。

3、linux container提供了在单一可控主机节点行支持多个相互隔离的server container同时执行的机制。linux container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

4、lxc与docker的关系

  1)docker并不是LXC的替代品,docker的底层就是使用了lxc来实现的,lxc将linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。

  2)在LXC的基础之上,docker提供了一系列更强的功能

2.2安装使用lxc

2.2.1基础的操作命令

lxc-checkconfig  检查系统环境是否满足容器使用要求

lxc-create:  创建lxc容器

  lxc-create -n NAME -t TEMPLATE_NAME

lxc-start  启动容器

  lxc-start -name NAME -d

lxc-stop  停止容器(停止命令很慢)

  lxc-stop -n NAME -d

lxc-info  查看容器相关的信息

  lxc-info -n NAME

lxc-destory  删除处于停机状态的容器

lxc-snapshot  创建和恢复快照

2.2.2安装

1)安装lxc和lxc自带的模板包(需要安装epel扩展源)

[root@hackerlin ~]# yum -y install lxc lxc-templates

2)检测环境

[root@hackerlin ~]# lxc-checkconfig

3)创建一个命名为C1的容器

[root@hackerlin ~]# lxc-create -n c1 -t /usr/share/lxc/templates/lxc-centos

4)安装完成之后会显示在那个目录下,密码存放在哪儿,和修改密码的命令

lxc容器不支持docker lxc docker_python

 

 

[root@hackerlin ~]# cat /var/lib/lxc/c1/tmp_root_pass 
Root-c1-65E2lQ
[root@hackerlin ~]# chroot /var/lib/lxc/c1/rootfs passwd
Changing password for user root.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: Authentication token manipulation error

2.2.3开启一台lxc容器

1)尝试开启

[root@hackerlin ~]# lxc-start -n c1(这里会报错,报错信息如图,报错内容是没有virbr0网桥)

lxc容器不支持docker lxc docker_虚拟化_02

 

 

 2)创建网桥

安装网桥包

[root@hackerlin ~]# yum -y install bridge-utils

查看网桥信息

[root@hackerlin ~]# brctl show
bridge name    bridge id        STP enabled    interfaces

创建virbr0网桥

[root@hackerlin ~]# brctl addbr virbr0

查看网桥是否创建成功

[root@hackerlin ~]# ip a | grep virbr0
7: virbr0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
[root@hackerlin ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:54:56:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.72.200/24 brd 192.168.72.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7618:aafe:1cd0:5c74/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
7: virbr0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether d6:c5:88:6f:6e:b0 brd ff:ff:ff:ff:ff:ff

激活网桥

[root@hackerlin ~]# ip link set dev virbr0 up

查看是否激活

[root@hackerlin ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:54:56:5c brd ff:ff:ff:ff:ff:ff
    inet 192.168.72.200/24 brd 192.168.72.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::7618:aafe:1cd0:5c74/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
7: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether d6:c5:88:6f:6e:b0 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d4c5:88ff:fe6f:6eb0/64 scope link 
       valid_lft forever preferred_lft forever

配置网桥地址

[root@hackerlin ~]# ip addr add 10.0.0.1/24 dev virbr0

3)再次开启容器

[root@centos7-1 ~]# lxc-start -n c1 输入用户密码登录

 

lxc容器不支持docker lxc docker_python_03

添加ip 地址10.0.0.2

 

[root@c1 ~]# ip addr add 10.0.0.2/24 dev eth0

 

测试与宿主机已经连通

[root@c1 ~]# ping 10.0.0.1

lxc容器不支持docker lxc docker_python_04

 

2.2.4. 开启第2台容器

创建c2

[root@centos7-1 ~]# lxc-create -n c2 -t /usr/share/lxc/templates/lxc-centos

改密码

[root@centos7-1 ~]# chroot /var/lib/lxc/c2/rootfs passwd

登录

[root@centos7-1 ~]# lxc-start -n c2

添加ip 地址10.1.0.3

[root@c2 ~]# ip addr add 10.1.0.3/24 dev eth0

测试与宿主机和另一台容器c1 的连通

[root@c2 ~]# ping 10.1.0.1

[root@c2 ~]# ping 10.1.0.2

在宿主机上,查询容器状况

[root@centos7-1 ~]# lxc-top

 

lxc容器不支持docker lxc docker_lxc容器不支持docker_05

2.2.5. 使容器连通外网

(1)在宿主机 配置 NAT规则

打开核心转发

[root@centos7-1 ~]# sysctl -w net.ipv4.ip_forward=1

做NAT 规则

[root@centos7-1 ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -j SNAT --to-source 192.168.10.103

(2)在两个容器内添加网关

[root@c1 ~]# ip route add default via 10.1.0.1 添加网关

[root@c1 ~]# ip route sh 查询网关

[root@c1 ~]# ping www.baidu.com 测试网关是否生效

2.2.6. LXC 的web管理页面

(1)下载git 项目

[root@centos7-1 ~]# git clone https://github.com/lxc-webpanel/LXC-Web-Panel.git

(2)安装python-flask,因为该项目是Python开发

(a)下载安装pip

准备安装pip 环境

[root@centos7-1 ~]# wget http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11-py2.7.egg

[root@centos7-1 ~]# sh setuptools-0.6c11-py2.7.egg

官网下载pip,https://pypi.org/project/pip/#files

 

lxc容器不支持docker lxc docker_虚拟化_06

 

 

 

安装

[root@centos7-1 ~]# tar xvf pip-10.0.1.tar.gz 解包

[root@centos7-1 ~]# cd pip-10.0.1/

[root@centos7-1 pip-10.0.1]# python setup.py install

(b)使用pip安装flask

[root@centos7-1 ~]# pip install python-flask

 

(3)开启lxc web管理页面的服务

① 开启

[root@centos7-1 ~]# cd LXC-Web-Panel/

[root@centos7-1 LXC-Web-Panel]# python lwp.py

 

 

lxc容器不支持docker lxc docker_python_07

 

 

 

② 网页登录

 

lxc容器不支持docker lxc docker_python_08

 

 

 

③  网页功能:一些容器的控制;开启,关闭,创建/克隆/重启容器,调节容器资源限制... ...

 

lxc容器不支持docker lxc docker_python_09