编程 用 LXD/Incus 跑系统容器:lxc 客户端、日常运维与选型取舍

2026-09-25 00:04:45

用 LXD/Incus 跑系统容器:lxc 客户端、日常运维与选型取舍

从 LXC 到 LXD

淘系早期容器系统是基于 LXC 构建的 T4 系统,那时 LXC 还很原始,网络和 cgroup 管理都要自己拼凑。Docker 崛起后,业界万物皆容器,Kubernetes 横扫基础架构,LXC 一度被遗忘。但 Docker 以轻量应用为中心的运行理念,让一部分持久化、稳定性要求高、且深度绑定 systemd 的系统级「全能」容器很难做——在 Docker 里跑 systemd 极其麻烦。基于 LXC 构建的 LXD 为这类系统级底层服务开了新路:

  • 能同时管理容器和虚拟机,提供运行和管理「完整」Linux 系统的一致体验;
  • 支持大量 Linux 发行版,内建简洁的 REST API;
  • 可在单机部署,也能在数据中心大量服务器上组建集群。

一个典型用法是拿 LXD 构建轻量级 Kubernetes Node 节点模拟,替代之前的 KVM 方案:KVM 对 Host 资源消耗大,HomeLab 里希望硬件都用在业务上。kind 是简化版 Docker 模拟 k8s,把 HomeLab 的模拟能力削弱了,所以改用 LXD 做底座。

概念边界:lxc 是客户端,LXD/Incus 是 daemon

lxc 只是命令行客户端,它连的是 LXD/Incus daemon 的 REST API,本地默认走 unix socket。真正干活的是 daemon。

LXD 是构建在 LXC 之上的 daemon/管理器,同一套体验里既能管系统容器,也能管虚拟机(VM)。系统容器是完整的 Linux 用户空间,能跑 systemd,所以 systemctl、日志、网络配置这些和一台真机几乎一样;Docker 是应用级容器,在 Docker 里跑 systemd 很别扭——这是选系统容器的直接理由。

LXD 现由 Canonical 主导(linuxcontainers.org/lxd),社区分叉出 Incus(linuxcontainers.org/incus)。两者命令与概念高度一致,下面这些 lxc 子命令在两边基本通用。

安装与初始化

sudo apt install lxd
sudo lxd init        # 初始化存储池与网络

日常运维命令

lxc launch images:ubuntu/24.04 c1      # 创建并启动实例
lxc list                               # 列出实例(含 IP、状态)

lxc exec c1 -- bash                    # 进入容器
lxc exec c1 -- systemctl status        # 直接跑命令(系统容器里有 systemd)

lxc config show c1                     # 查看配置
lxc config set c1 limits.cpu 2         # 改配置,可热生效

lxc stop c1
lxc start c1
lxc restart c1

lxc snapshot c1 snap0                  # 打快照
lxc restore c1 snap0                   # 回滚快照

lxc copy c1 c2                         # 复制实例
lxc move c1 remote:c1                  # 迁移(含跨远端)

lxc file push ./app c1/root/           # 推送文件进实例
lxc file pull c1/etc/hosts .           # 从实例拉文件出来

lxc info c1                            # 详情、日志

lxc image list images:                 # 查看远端镜像

几点使用习惯:

  • lxc list 会把 IP 和运行状态列出来,lxc info c1 里能看到更详细的配置与日志;
  • lxc config show / lxc config set 配合用,CPU、内存这类限制不必停机改;
  • 动配置或做实验前先 lxc snapshot,出问题 lxc restore 回去,比重建快;
  • lxc copy 和 lxc move 的目标可以是本地另一个实例,也可以是远端 remote: 前缀,用来做冷迁移或者备份。

存储池与网络

存储池类型:dir、btrfs、lvm、zfs、ceph 等。网络类型:bridge、macvlan、ovn 等。这些在 lxd init 时选定,之后也能增删调整;不同后端直接影响快照、配额和性能表现。

什么时候用系统容器

  • 替代长期运行的系统服务:需要完整 OS、持久化状态、systemd 管理单元;
  • HomeLab 里模拟多节点集群,比如 k8s Node,比开一堆 VM 省资源;
  • 想省 VM 开销,又不想在 Docker 里硬塞 systemd。

什么时候仍用 Docker 或 VM

  • Docker:微服务、CI/CD、镜像分发,这是应用级容器的强项,镜像构建和分发链路也更成熟;
  • 直接上 VM:需要强隔离的场合,或者要跑非 Linux 系统。

注意项

  • 生产环境不要用默认的 dir 存储池:快照和配额支持弱,效率也低,初始化时就该换成 zfs/lvm/btrfs 之类。
  • 非特权容器与宿主机目录共享时,属主和 idmap 需要另行处理,直接挂载会出现宿主与容器内权限对不上的情况。

参考链接

复制全文 生成海报 linux container LXC LXD Incus 系统容器 容器运维

推荐文章

程序员茄子在线接单