LXC容器简明教程
LXC(LinuX Containers)是一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。与Docker/Podman不同,LXC注重的是容器化的操作系统而不是应用。使用LXC就如同在裸机或虚拟机上运行了一个完整的Linux操作系统,这些容器一般基于一个干净的发布镜像并会长时间运行。
安装
1 | # Debian |
检查容器模板文件:ls /usr/share/lxc/templates
配置
LXC的服务配置文件位于/etc/defaults/lxc
(Debian)或/etc/sysconfig/lxc
(RHEL),内容如下:
1 | # 是否启用开机启动,这一选项在systemd下没有意义 |
设置完成后,启动主服务,它掌管容器开机启动:systemctl enable --now lxc
LXC的网络服务配置文件位于/etc/defaults/lxc-net
(Debian)或/etc/sysconfig/lxc-net
(RHEL),内容如下:
1 | # 启用自动生成的lxcbr0网桥,这需要dnsmasq包 |
设置完成后,启动网络服务,它掌管网桥配置:systemctl enable --now lxc-net
LXC的默认网桥为lxcbr0
,宿主机侧的veth会桥接在该网桥上,LXC会自动设置nftables防火墙进行NAT,使得容器能够联通外网。
在旧版本的RHEL中,默认不创建此网桥,用户需要使用自己创建的网桥。
若要启用此网桥,先安装dnsmasq
包(但是不必启动dnsmasq
服务),然后修改/etc/sysconfig/lxc
,将USE_LXC_BRIDGE=
改为"true"
,然后重启LXC网络服务systemctl restart lxc-net
。
最后,启动lxcfs服务,它为容器提供了主机伪文件系统虚拟化的接口:systemctl enable --now lxcfs
系统级容器配置文件位于/etc/lxc/default.conf
(默认通用)和/var/lib/lxc/容器名/config
(独立配置)。
用户级容器配置文件位于~/.config/lxc/default.conf
(默认通用)和~/.config/lxc/容器名/config
(独立配置)。
主要配置内容如下:
以下配置建议写入通用配置文件内:
1 | lxc.include = /path |
以下内容建议写入容器特定的配置文件内:
1 | lxc.tty.dir = lxc |
使用物理网卡
将物理网卡分配给容器而不影响主机使用的一种方法是创建子网卡。
首先创建子网卡ip addr add 192.168.8.222/24 label enp?s?:? dev enp?s?
然后编辑容器配置:
1 | lxc.net.1.type = phys |
使用自建网桥
用户自建网桥后,可以将主机方的Veth桥接到自己创建的虚拟网桥上,对于自建的网桥,LXC不会进行NAT,用户可以将主机网卡也桥接到网桥上,实现二层交换。
首先创建虚拟网桥:brctl addbr br?
brctl addif br? enp?s?
或ip link add br? type bridge
ip link set enp?s? master br?
给网桥分配IP:ip addr add 192.168.?.?/24 dev br?
当然,使用自动化的网络管理工具创建网桥也是可以的。
然后编辑容器配置:
1 | lxc.net.0.type = veth |
设置非root容器
无特权容器不能直接挂载主机上的网络存储,也不能运行嵌套容器。
对于存储的挂载,用户应当在宿主机上进行挂载,然后设置目录映射。
首先给用户添加子UID和子GID:usermod 用户名[root] -v|--add-subuids UID段[100000-165535]
添加子UIDusermod 用户名[root] -V|--del-subuids UID段[100000-165535]
删除子UIDusermod 用户名[root] -w|--add-subgids GID段[100000-165535]
添加子GIDusermod 用户名[root] -W|--del-subgids GID段[100000-165535]
删除子GID
如果使用普通用户创建容器,还需要设置内核参数:kernel.unprivileged_userns_clone=1
,写入/etc/sysctl.conf
,然后执行sysctl -p
即可。
然后编辑容器设置,给容器配置用户映射:
1 | # 从左到右依次为:用户或组,容器内ID起点,宿主机ID起点,映射数量 |
执行lxc-create
创建容器,然后执行lxc-attach -n 容器名 passwd
(需要先启动)修改密码。
由于非特权容器的特殊性,对于某些目录的挂载是必然失败的,这其中的典型包括sys-kernel-debug.mount
和sys-kernel-config.mount
,还有某些服务也可能会出错,比如systemd-journald-audit.socket
和apparmor.service
;对于这些服务,可以考虑删除/etc/fstab
中的挂载点,或者直接systemctl mask
掉。
容器性能限制
使用cgroup v2实现容器的性能限制,编辑配置文件添加:lxc.cgroup2.配置组.配置项 = 大小
例如:
1 | lxc.cgroup2.cpu.share = 1024 # CPU占用比例 |
注:LXC使用目录作为根文件系统,要限制容器根分区大小,请使用配额或子卷。
操作
检查配置情况lxc-checkconfig
创建容器lxc-create [-B best|dir|lvm|loop|btrfs|zfs|rbd] -t download -n 容器名 -- --server mirrors.tuna.tsinghua.edu.cn/lxc-images [--dist 发行版] [--release 版本号] [--arch 架构]
默认情况下使用dir
即目录保存容器文件系统,用户也可以指定其他的存储方式,包括以下几种:
best
,自动检测并尝试使用最佳的存储后端。dir
,使用普通的目录进行存储,这意味着容器的文件系统与宿主机的文件系统一致,而且大小没有限制。loop
,回环文件系统。会创建一个镜像文件rootdev
进行存储,可以通过--fstype
指定文件系统(默认情况下为ext4
),--fssize
指定镜像最大大小(默认情况下为1G)。lvm
,逻辑卷。默认情况下会创建卷组lxc
,精简池lxc
,1G的容器同名LV,ext4
文件系统进行存储。可以通过--vgname
指定VG名,--thinpool
指定精简池名,--lvname
指定LV名,--fstype
指定文件系统,--fssize
指定卷大小。btrfs
,Btrfs子卷。会创建容器的同名子卷进行存储。rbd
,远程块设备。不太常用。
一般选择download
模板从远程进行下载,这里使用--server
指定镜像源,--
表示结束lxc-create
的选项,将后面的选项传送给下载脚本。
如果没有指定,那么下载时会交互式选择系统,版本和架构。
创建的容器的根文件系统位于/var/lib/lxc/容器名/rootfs
(系统容器)或~/.local/share/lxc/容器名/rootfs
(用户容器),要修改容器初始root密码,执行lxc-attach -n 容器名 passwd
(需要先启动)或者chroot /容器根文件系统 passwd
。
列出容器lxc-ls [-f|--fancy]
-f|--fancy
表示显示详细信息。
查看容器配置lxc-config -l
查看所有可用配置项。
查看容器信息lxc-info -n 容器名
启动容器lxc-start [-F] -n 容器名
-F 启动时立刻进入前台,否则默认为-d,即后台启动
停止容器lxc-stop [-W] [-k] [-r] -n 容器名
-W 并不等待容器停止
-k 强制杀死容器
-r 重启容器
在容器中执行命令lxc-attach [-e] -n 容器名 [命令]
若没有命令,默认在容器中以当前用户身份启动Shell,这相当于lxc-console
,但是不会进行登录(这意味着没有任何用户变量),而且总是会产生新会话。
-e 使用提升权限执行命令
进入容器lxc-console -n 容器名 [-t TTY号]
这会进入容器的指定TTY并进行登录流程,当TTY号为0时,使用/dev/console
。
在LXC容器中,当进入容器时实际上是将容器中的/dev/ttyN
映射到了主机当前所使用的TTY上,也就是说,如果映射了/dev/console
(容器中不存在tty0,/dev/console
没有依附的终端),那么可以在当前主机的TTY上看到容器系统的内部信息。
脱离容器
使用Ctrl+A+Q
快捷键脱离容器终端。
这个快捷键在现在的版本上往往不能使用。强烈建议使用SSH进行连接。
删除容器lxc-destroy -n 容器名 [-f] [-s]
-s 连同删除所有快照
-f 强制删除
拷贝容器lxc-copy [-R] -n 容器名 -N 新容器名
-R 交换容器名和新容器名
制作快照lxc-snapshot -n 容器名
列出快照lxc-snapshot -n 容器名 -L|--list
恢复快照lxc-snapshot -n 容器名 -r 快照名 [-N 新容器名]
分配物理设备lxc-device add /dev/设备名 -n 容器名
lxc-device del /dev/设备名 -n 容器名
监控所有容器lxc-top
监控单个容器状态lxc-monitor -n 容器名
批量启动lxc-autostart -g 组名[onboot]