你将学到什么

  • 如何安装LXC
  • 如何创建LXC容器
  • 如何管理LXC容器
  • 如何查询进程所属Namespace
  • 如何给LXC容器添加网卡
  • 如何限制LXC容器资源

环境

x64 Ubuntu 14.04.3 LTS

安装LXC

### 安装LXC软件包
# sudo apt-get install lxc
### 检查内核是否支持LXC
# lxc-checkconfig

创建LXC容器

### 列举容器模板脚本
$ ls /usr/share/lxc/templates
lxc-alpine lxc-centos lxc-fedora lxc-oracle lxc-ubuntu-cloud
lxc-altlinux lxc-cirros lxc-gentoo lxc-plamo
lxc-archlinux lxc-debian lxc-openmandriva lxc-sshd
lxc-busybox lxc-download lxc-opensuse lxc-ubuntu
### 打印模板脚本使用说明
$ /usr/share/lxc/templates/lxc-ubuntu -h
### 创建ubuntu容器
$ sudo lxc-create -n <container-name> -t ubuntu
### 创建指定版本ubuntu容器,'--'表示后面的参数将传递给模板脚本
$ sudo lxc-create -n <container-name> -t ubuntu -- -r xenial
### 第一次创建容器,如果创建结束后没有默认用户名密码提示,使用chroot命令启动容器的rootfs来添加登入用户名和密码,容器对应的rootfs位于/var/lib/lxc/<container-name>/rootfs
  • 容器配置样例
lxc.mount.auto = proc:mixed sys:ro
lxc.tty = 4
lxc.pts = 1024
lxc.devttydir = lxc
lxc.arch = x86_64
lxc.seccomp = /usr/share/lxc/config/common.seccomp
lxc.cgroup.devices.deny = a
lxc.cgroup.devices.allow = c *:* m
lxc.cgroup.devices.allow = b *:* m
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
lxc.cgroup.devices.allow = c 1:7 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
lxc.utsname = test
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:88:f8:f6
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br-mgmt
lxc.network.hwaddr = 00:16:3e:88:f8:e6
lxc.cap.drop = mac_admin
lxc.cap.drop = mac_override
lxc.cap.drop = setfcap
lxc.cap.drop = sys_module
lxc.cap.drop = sys_nice
lxc.cap.drop = sys_pacct
lxc.cap.drop = sys_rawio
lxc.cap.drop = sys_time
lxc.hook.clone = /usr/share/lxc/hooks/clonehostname
lxc.rootfs = /var/lib/lxc/<container-name>/rootfs

管理LXC容器

### 列举容器
$ sudo lxc-ls --fancy
### 运行容器
$ sudo lxc-start -n centos -d
### 打开容器控制台
$ sudo lxc-console -n centos
### 关闭和删除容器
$ sudo lxc-stop -n <container-name>
$ sudo lxc-destroy -n <container-name>
### 克隆容器
$ sudo lxc-clone <orgi-container-name> <new-container-name>

Namespace查询

### 根据进程PID,查询/proc/<PID>/ns目录,相同名字的'[]'内数字不同,表示两进程不在同一命名空间下,如下:

### 容器内
# ls -l /proc/1/ns/
total 0
lrwxrwxrwx 1 root root 0 Feb 26 22:00 ipc -> ipc:[4026532525]
lrwxrwxrwx 1 root root 0 Feb 26 22:00 mnt -> mnt:[4026532523]
lrwxrwxrwx 1 root root 0 Feb 26 22:00 net -> net:[4026532528]
lrwxrwxrwx 1 root root 0 Feb 26 22:00 pid -> pid:[4026532526]
lrwxrwxrwx 1 root root 0 Feb 26 22:00 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Feb 26 22:00 uts -> uts:[4026532524]
### 容器外
# ls -l /proc/1/ns
total 0
lrwxrwxrwx 1 root root 0 Feb 27 10:58 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Feb 27 10:58 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Feb 27 10:58 net -> net:[4026531957]
lrwxrwxrwx 1 root root 0 Feb 27 10:58 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Feb 27 10:58 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Feb 27 10:58 uts -> uts:[4026531838]

LXC容器添加网卡

  • 创建网桥
### 在宿主机上创建网桥,并分配IP,绑定到此网桥的LXC容器网卡IP都位于此网段内
$ sudo brctl addbr br-mgmt
$ sudo ip addr add 10.0.0.1/24 dev br-mgmt
$ sudo ifconfig br-mgmt up
  • 修改容器配置文件
### 关闭容器
$ sudo lxc-stop -n <container-name>
### 修改容器配置文件,添加如下内容,其中lxc.network.link为我们刚创建的网桥,lxc.network.hwaddr地址不能重复
### ···
### lxc.network.type = veth
### lxc.network.flags = up
### lxc.network.link = br-mgmt
### lxc.network.hwaddr = 00:16:3e:88:f8:e6
### ···
$ sudo vim /var/lib/var/lib/lxc/<container-name>/config
### 启动容器
$ sudo lxc-start -n <container-name>
  • 为网卡在容器内新增网络配置文件
### 登入容器
$ sudo lxc-console -n <container-name>
### 在容器中新增配置文件,DEVICE为新增网卡名,IPADDR不重复即可,HOSTNAME为当前容器主机名,HWADDR为新增网卡MAC地址
### DEVICE=eth1
### BOOTPROTO=none
### ONBOOT=yes
### HOSTNAME=test
### NM_CONTROLLED=no
### TYPE=Ethernet
### IPADDR=10.0.0.11
### NETMASK=255.255.255.0
### HWADDR=00:16:3e:88:f8:e6
$ sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1

LXC容器开机自启动

### 修改容器配置文件,添加如下内容
### lxc.start.auto = 1
### lxc.start.delay = 15
### lxc.group = onboot
### 第一项表示开启自启动,第二项表示启动延迟,第三项表示自启动顺序
# vim /var/lib/var/lib/lxc/<container-name>/config
### 自启动onboot组的容器
# lxc-autostart -g onboot

LXC容器资源管理

### 设置LXC容器资源,使用lxc-cgroup命令设置的参数在容器重启后就会被重置
# lxc-cgroup -n <container-name> state-object [value]
### 查询LXC容器Cgroup,不加[value]就是查询参数的当前值
# lxc-cgroup -n <container-name> state-object

CPU资源

指定CPU

# lxc-cgroup -n <container-name> cpuset.cpus [value]

测试程序

#!/usr/bin/python

i = 0
while True:
i = i + 1

在容器中执行

# python deadloop.py

在主机中使用top命令查询,然后按下'1'键显示CPU列表会发现Cpu0已经100%了

top - 14:54:08 up 1 day,  2:37,  4 users,  load average: 0.21, 0.07, 0.06
Tasks: 160 total, 2 running, 158 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2048452 total, 30436 free, 185968 used, 1832048 buff/cache

在宿主机执行

# lxc-cgroup -n web cpuset.cpus 1

观察top命令的显示会发现Cpu1变成100%了

top - 14:56:53 up 1 day,  2:40,  4 users,  load average: 0.94, 0.45, 0.21
Tasks: 163 total, 2 running, 161 sleeping, 0 stopped, 0 zombie
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2048452 total, 34072 free, 186416 used, 1827964 buff/cache
KiB Swap: 2097148 total, 2096760 free, 388 used. 1800156 avail Mem

设置CPU使用率

# lxc-cgroup -n <container-name> cpu.cfs_quota_us [value]

内存资源

# lxc-cgroup -n <container-name> memory.limit_in_bytes [value]

测试程序

#!/usr/bin/python

l = []
while True:
l.append('fwd')

在容器中执行

# python deadloop.py

过会进程就会因为内存问题而被Kill了

# python deadloop.py
Killed

在宿主机执行

# lxc-cgroup -n web memory.limit_in_bytes 10485760

然后在容器中再次执行

# python deadloop.py

然后在宿主机执行top命令会发现,进程的内存使用率被限制了(就是0.2)

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

10122 root      20   0  765944   4340    176 R  94.7  0.2   0:35.79 python

问题处理

  • lxc-execute执行有如下提示
# lxc-execute -n ubuntu -- /bin/bash
lxc-execute: execute.c: execute_start: 67 Failed to find an lxc-init or init.lxc
lxc-execute: sync.c: __sync_wait: 57 An error occurred in another process (expected sequence number 5)
lxc-execute: start.c: __lxc_start: 1346 Failed to spawn container "ubuntu".

第一种解决办法

### 使用高版本ubuntu,例如16.04 TLS
# cat /etc/issue
Ubuntu 16.04 LTS \n \l ### 拷贝/usr/sbin/init.lxc脚本到容器中
# cp /usr/sbin/init.lxc /var/lib/lxc/<container-name>/rootfs/usr/sbin/ ### 拷贝lxc库到容器中
# cp /usr/lib/x86_64-linux-gnu/liblxc.so.1.2.0 /var/lib/lxc/<container-name>/rootfs/usr/lib/x86_64-linux-gnu/
# cd /var/lib/lxc/<container-name>/rootfs/usr/lib/x86_64-linux-gnu/
# ln -s liblxc.so.1.2.0 liblxc.so.1

第二种解决办法

### 在容器中安装lxc
# apt-get install 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. 生成Alpine LXC容器的根文件系统

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

  4. LXC容器

    1.    LXC简述 Linux container是一种资源隔离机制而非虚拟化技术.VMM(VMM Virtual Machine Monitor)或者叫Hypervisor是标准的虚拟化技术,这 ...

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

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

  6. vector容器的用法

    转自一篇博客^-^: 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<int> vec; (3)尾部插入数字:vec.p ...

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

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

  8. java 容器 集合 用法

    Set,List,Map,Vector,ArrayList的区别 JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└ ...

  9. LXC 容器集chroot使用说明

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

随机推荐

  1. Kafka- Kafka架构功能

    Kafka是一个高吞吐量的分布式消息系统,一个分布式的发布-订阅消息系统.Kafka是一种快速,可拓展的,设计内在就是分布式的,分区的可复制的提交日志服务. Apache Kafka与传统消息系统相比 ...

  2. C#中string.Empty、""和null 之间的区别

    1.C#中string.Empty.""和null 之间的区别 (http://blog.csdn.net/henulwj/article/details/7830615)

  3. css中单位px和em,rem的区别

    PX:PX实际上就是像素,用PX设置字体大小时,比较稳定和精确.但是这种方法存在一个问题,当用户在浏览器中浏览我们制作的Web页面时,如果改变了浏览器的缩放,这时会使用我们的Web页面布局被打破.这样 ...

  4. WebElement接口获取值

    通过WebElement接口获取值 size 获取元素的尺寸 text 获取元素的文本 get_attribute(name) 获取属性值 location 获取元素坐标,先找到要获取的元素,再调用该 ...

  5. HashMap,Hashtable,TreeMap ,Map

    package com.wzy.list; import java.util.HashMap; import java.util.Hashtable; import java.util.Iterato ...

  6. php 实现分享到QQ空间 新浪微博

    //分享到新浪微博 $('#blog').click(function(){ window.sharetitle = '<%$info.title%>';//标题 window.share ...

  7. 04 - Django应用第一步

    知识点 1) 创建项目命令 以及项目结构介绍 2) 创建应用程序命令 应用, 项目的区别 以及应用程序结构 3) 启动项目命令 4) URLs的编写 include()的使用 get发送参数的格式 u ...

  8. type_traits.h

    type_traits.h // Filename: type_traits.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: ht ...

  9. 多媒体的框架 - OpenCore框架概述

    OpenCore是一个多媒体的框架,从宏观上来看,它主要包含了两大方面的内容:PVPlayer:提供媒体播放器的功能,完成各种音频 (Audio).视频(Video)流的回放(Playback)功能. ...

  10. 股神小L

    题解 贪心 若当前手中还持有股,则一定会卖出去. 否则,考虑之前卖出的最便宜的股,若售价比当前的股高,就买下这个股,否则我们就把之前卖出的最便宜的股改为买入,这样一定会有股,然后再把这个股卖出即可. ...