Skip to main content

LXC 容器的基本玩法

基础使用

测试环境:debian

安装 LXC 软件包

apt install lxc

检查内核是否支持 LXC

lxc-checkconfig

执行后可能出现下面错误

--- Misc ---
Veth pair device: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
Macvlan: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
Vlan: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
Bridges: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
Advanced netfilter: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
CONFIG_NF_NAT_IPV4: enabled/usr/bin/lxc-checkconfig: 46: /usr/bin/lxc-checkconfig: lsmod: not found
, not loaded
, not loaded

可以通过下列命令安装 lsmod 进行修复

apt install kmod

列举容器模板脚本

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 容器

lxc-create -n <container-name> -t ubuntu

创建指定版本 ubuntu 容器

# `--` 表示后面的参数将传递给模板脚本
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 容器

例举容器

lxc-ls --fancy

运行容器

lxc-start -n centos -d

打开容器控制台

lxc-console -n centos

关闭容器

lxc-stop -n <container-name>

删除容器

lxc-destroy -n <container-name>

克隆容器

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 都位于此网段内

brctl addbr br-mgmt
ip addr add 10.0.0.1/24 dev br-mgmt
ifconfig br-mgmt up

修改容器配置文件

# 关闭容器
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

vim /var/lib/var/lib/lxc/<container-name>/config
# 启动容器
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 容器资源,不加 [value] 就是查询参数的当前值
# 使用 lxc-cgroup 命令设置的参数在容器重启后就会被重置
lxc-cgroup -n <container-name> state-object [value]

设置使用第几个 cpu

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

设置 cpu 使用率

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

设置内存使用率

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

参考