LXC容器运行时

1 LXC项目介绍

​ LXC是在crgoup被引入Linux内核后立即被创建的项目,它被设计用于"full-system" 容器,是用来创建Linux容器的,此时的Linux容器跟我们现在常用的Linux上Docker容器或containerd容器是有区别的,最显著的区别在于它们使用不是容器运行时不同。同时Systemd也获得了类似的容器支持,systemd-nspawn可以运行命名空间进程,systemd本身可以控制cgroup。尽管lxc与systemd-nspawn也在其他项目中被利用到了,但它们还是没有能够吸引足够多的终端用户。现在并不是一个流行的开源容器化项目。

2 LXC容器运行时介绍

​ LXC 是一个早期知名的Linux 容器运行时,主要由C语言实现。官网参考 https://linuxcontainers.org/lxc/introduction/ 。

image-20241227233124311
image-20241227233051173

​ OCI(Open Container Initiative)规范主要定义了容器运行时的标准,包括容器的镜像格式、容器的生命周期管理(如创建、启动、停止、删除)、配置管理(如挂载点、环境变量等)以及资源管理(如CPU、内存分配)等多个方面。符合 OCI 规范的容器运行时可以更好地与其他符合该规范的工具和平台进行交互和协作。

​ LXC 并不完全符合OCI 规范。LXC 有自己独立的一套容器创建和管理机制,它主要是利用Linux 内核的 cgroups 和 namespaces 特性来实现容器的隔离和资源管理。

​ 尽管 LXC 本身不符合OCI 规范,但在某些场景下可以实现一定程度的兼容。例如,可以通过一些中间层工具或者适配层来使 LXC 容器与基于 OCI 规范的生态系统进行交互。不过,这种方式相对复杂,并且可能会损失一些LXC 本身的特性或者引入额外的开销,笔者未做探讨研究,此文不涉及。

3 安装LXC

软硬件要求

  • 支持多种构架如amd64、arm64、riscv64、armhf等

  • 要使用 lxc-attach及非特权容器,就必须满足以下条件:

    • Linux kernel >= 3.12
    • 至少有glibc, musl libc, uclib or bionic 其中一个作为操作系统的 C library
  • 其余推荐的信赖库:

    • libcap (to allow for capability drops)
    • libapparmor (to set a different apparmor profile for the container)
    • libselinux (to set a different selinux context for the container)
    • libseccomp (to set a seccomp policy for the container)
    • libgnutls (for various checksumming)
    • liblua (for the LUA binding)
    • python3-dev (for the python3 binding)

安装步骤

1
2
3
4
#在ubuntu20.04LTS-amd64上安装lxc
$ apt-get install lxc
#验证安装成功(成功时输出大致如下)
root@ubuntu20:~# lxc-info --version4.0.12

4 简单使用LXC

命令行形式

1
2
3
4
5
6
7
8
9
#创建lxc容器(第一次创建lxc容器时耗时较长)
#4.1 只通过-t指定模板(其实就是容器镜像)名称,不指定标签与构架,那么标签与构架与宿主机靠齐
root@ubuntu20:~# lxc-create -n my_lxc_ubuntu -t ubuntu
#4.2 执行创建lxc容器的命令时不指定模板名称,创建过程中互动指定(指定Distribution、Release、Architecture)
#所有容器模板好像是被官方维护的(具体还未研究)
root@ubuntu20:~# lxc-create --template download --name my-container
#如果已经知道这三个参数可以是什么,当然也可以在上述命令直接指定下面的3个参数
root@ubuntu20:~# lxc-create --template download --name my-container -- --dist opensuse --release 15.5 --arch amd64
#没有指定--dist、--release、--arch参数时,创建中通过如下方式指定
image-20241227232807348
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#4.3 启动容器:创建出来的lxc容器默认是停止状态,需要手动启动
root@ubuntu20:~# lxc-start -n my-container
#4.4 进入lxc容器内
root@ubuntu20:~# lxc-attach -n my-container
#4.5 执行命令:进入容器内后,可以在容器内执行命令
my-container:~ # cat /etc/os-release 
NAME="openSUSE Leap"
VERSION="15.5"
ID="opensuse-leap"
ID_LIKE="suse opensuse"


#4.6 从lxc容器内退出
my-container:~ # exit
#4.7查看所有的容器
root@ubuntu20:~# lxc-ls -f
#4.8查看容器信息 
root@ubuntu20:~# lxc-info -n my-container
#4.9 停掉容器
root@ubuntu20:~# lxc-stop -n my-container
#4.10 删除容器
root@ubuntu20:~# lxc-destroy -n my-container 
#暂时未弄清楚是否可以定制lxc容器镜像,理论上应该是可以的。
#因为这个lxc容器暂时未真正使用,暂时不再研究

​ 其他关于命令行对lxc容器进行操作的说明,参见官方文档:https://linuxcontainers.org/lxc/getting-started/

API调用形式

​ 从官网看到的内容,目前支持C语言与Python语言通过API形式对lxc容器相关操作。具体参见:https://linuxcontainers.org/lxc/documentation/

5 LXC其他资源介绍

1)lxc容器当前虽然并不是很火,但其一直在迭代,其所有版本信息及下载:https://linuxcontainers.org/lxc/downloads/

2)lxc项目对应代开源代码仓库地址:https://github.com/lxc/lxc

3)lxc相关指令的manpage:https://linuxcontainers.org/lxc/manpages

4)lxc容器安全机制介绍:https://linuxcontainers.org/lxc/security

6 备注与参考文章

​ 订阅号文章不方便更新,如后续有修改或完善,将更新到个人博客,博客地址参考文首。技术操作类文章推荐直接访问个人博客查阅,阅读效果更佳。

​ 某些观点或阐述,笔者水平有限无法给出正式严谨的答案,唯有引用或参考企业单位的官网与其他前辈的描述。本文某些内容来自以下文章:**

  • lxc官网:https://linuxcontainers.org/lxc
  • PolarSPARC文章:https://www.polarsparc.com/xhtml/LXC.html
  • csdn博客:https://blog.csdn.net/qq_44281591/article/details/132251767

LXC容器运行时
https://jiangsanyin.github.io/2024/12/27/LXC容器运行时/
作者
sanyinjiang
发布于
2024年12月27日
许可协议