Lxc容器基本用法


你將學到什么

  • 如何安裝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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM