zoukankan      html  css  js  c++  java
  • 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 
     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
    
  • 相关阅读:
    System.Web.Mvc.HttpHeadAttribute.cs
    System.Web.Mvc.HttpOptionsAttribute.cs
    System.Web.Mvc.HttpDeleteAttribute.cs
    sqlite-dbeaver-heidisql
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现圆周率
    java实现最近距离
  • 原文地址:https://www.cnblogs.com/silvermagic/p/7666242.html
Copyright © 2011-2022 走看看