对于远程开发环境来说,Docker 虽然轻量但设计上更适合单一应用的容器化,而 Incus 容器/系统容器形态的“开发机环境”,不是传统意义的 KVM 虚拟机。它更像“轻量 VM 体验的容器”(有独立 init、完整发行版用户态),适合做可快速复制/销毁的开发沙箱。
Incus 是 LXD 的社区分支,提供了与 LXD 类似的功能和体验,但由社区维护和开发。它旨在为用户提供一个稳定、可靠的容器管理平台,同时也欢迎社区的贡献和参与。
LXD 是一个由 Canonical 维护的容器管理平台,提供了丰富的功能和工具,适用于各种规模的容器化应用。
对比差异如下:
| 维度 | Incus(系统容器 / LXC)做远程开发机 | KVM 虚拟机(如 libvirt/QEMU)做远程开发机 | Docker(应用容器)做远程开发环境 |
|---|---|---|---|
| 形态定位 | “像一台机器”的容器:完整 userspace + systemd/sshd/apt | 真正虚拟机:完整 OS + 独立内核 | “跑进程/应用”的容器:单进程/少量进程为主 |
| VS Code Remote 适配 | Remote-SSH 最匹配(容器内跑 sshd) | Remote-SSH 最匹配(VM 内跑 sshd) | Remote-Containers/Dev Containers 最匹配;也可 Remote-SSH(不主流) |
| 隔离边界 | 共享宿主机内核;隔离弱于 VM | 强隔离(硬件虚拟化边界) | 共享宿主机内核;隔离与容器同类(取决于运行时/配置) |
| 内核/内核模块需求 | 不满足:不能换内核;内核模块能力受限 | 满足:可自定义内核/模块 | 不满足:同容器;无法换内核 |
| 启动速度/密度 | 快、密度高 | 慢、密度低 | 最快、密度最高(但不等价“开发机”) |
| 资源开销 | 低(接近容器) | 高(Guest OS + 内核) | 低(容器) |
| 网络形态 | VM 化:桥接/直通/路由/NAT,实例独立 IP 容易 | VM 化:桥接/直通/路由/NAT,最灵活 | 默认偏应用网络(bridge/overlay);做到“每环境独立 IP/网段”需要额外设计 |
| 存储/快照/克隆 | 存储池+快照/克隆很成熟(ZFS/LVM/dir/ceph 等) | 依赖 qcow2/LVM/ZFS 等;快照/克隆可做但通常更重 | 镜像层+volume;对“整机状态快照”不如前两者直观 |
| 多用户/多开发机治理 | 强:profile 统一下发挂载、limits、设备、GPU | 强:模板化镜像+cloud-init/配置管理 | 中:更多是“项目级环境”,多用户隔离与资源治理要额外平台化 |
| GPU 远程开发 | 可做(设备直通/绑定 + NVIDIA 工具链);共享内核前提 | 最好(直通、隔离清晰);成本高 | 常见(nvidia-container-runtime);适合“跑训练/推理服务”,做“整机开发”要补齐 systemd/ssh 等 |
| 适合的 VS Code 场景 | “给每人一台轻量开发机”,长生命周期,能装很多工具 | 安全边界清晰的企业/多租户;需要不同内核/驱动验证 | “每个项目一个可复现环境”,和仓库一起走 Dev Containers |
| 主要短板 | 内核共享带来的安全/兼容边界;部分底层能力受限 | 成本与运维重;启动慢;资源占用大 | 不像“机器”;多服务/长驻开发机体验需要额外工程化 |
| 典型选型结论(远程 VS Code) | 默认优先:想要 Remote-SSH + 轻量“机器感” | 安全/内核需求优先时选 | 复现/项目级优先时选 |
结合表格,Incus 的“系统容器”形态非常适合做“远程开发机”,尤其是当你想要一个轻量、快速启动、且具有完整 OS 体验的环境时。它提供了比 Docker 更接近传统开发机的体验,同时又比 KVM 虚拟机更高效和易于管理。
我的系统是 Debian12,在上面安装了 Incus 方法如下:
# 安装必要的密钥管理工具
apt update
apt install -y curl gpg
# 导入 GPG Key
mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc
# 添加源列表
sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc
EOF'
apt update
apt install -y incus
初始化
incus admin init
如果需要 NVIDIA GPU 支持,可以安装 incus-nvidia 包:
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt update
apt install -y libnvidia-container-tools
先创建一个 local-sys 存储池:
incus storage create local-sys dir
创建 incus 的应用配置模板文件:
incus profile create dev-basic
我的开发环境配置内容如下:
description: Basic CPU-only development environment
devices:
eth0:
name: eth0
nictype: bridged
parent: br0
type: nic
root:
path: /
pool: local-sys
type: disk
config:
limits.cpu: "16" # 限制 16 核
limits.memory: "64GB" # 限制 64G 内存
参数说明:
- br0 是我之前创建的桥接网络,连接到物理网络接口
- local-sys 是之前创建的存储池,使用本地目录存储容
- limits.cpu 和 limits.memory 分别限制容器使用的 CPU 核数和内存大小
创建一个 lxc 应用如下:
incus launch images:debian/12 chancel-box --profile default --profile dev-basic