Docker 适合"一进程 + 镜像分发"。LXC(system container)适合"我要一个
完整的 Linux,但不想多装一台 VM"——它共享宿主内核但提供完整的 init / cron /
ssh / multiple processes,像轻量 VM。
适合场景:本地开发环境隔离(一个项目一个 LXC,不脏宿主)、
跑老版本 Ubuntu 试旧软件、做 CI 隔离。
安装 LXD(LXC 的现代封装)
sudo snap install lxd
sudo lxd init
# 一路 Enter 用默认值:dir storage、新的 lxdbr0 网桥、不加 cluster
sudo usermod -aG lxd $USER
# 重新登录让 group 生效
启动一个容器
# 列可用镜像
lxc image list images: ubuntu/22.04 | head
# 启动
lxc launch images:ubuntu/22.04 devbox
lxc list
# +--------+---------+----------------------+------+-----------+-----------+
# | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
# +--------+---------+----------------------+------+-----------+-----------+
# | devbox | RUNNING | 10.10.20.42 (eth0) | | CONTAINER | 0 |
# +--------+---------+----------------------+------+-----------+-----------+
进去 / 跑命令
# 交互 shell
lxc exec devbox -- bash
# 一次性命令
lxc exec devbox -- apt update
lxc exec devbox -- apt install -y python3-pip git
# 以普通用户身份进
lxc exec devbox -- su - ubuntu
挂载宿主目录
# 把宿主 /home/yourname/code/myproj 挂到容器 /opt/myproj
lxc config device add devbox myproj disk \
source=/home/yourname/code/myproj \
path=/opt/myproj
ID 映射的小坑:默认 LXD 用 unprivileged container(UID 映射),
宿主的 1000:1000 在容器内是 1000:1000,权限正确。但如果宿主用了 NFS、
overlay 等,映射可能不直观,遇到再 lxc config show devbox 看。
端口映射 / 反代
容器有 IP 但 NAT 在宿主桥后。要把容器的 8080 暴露到宿主:
lxc config device add devbox webproxy proxy \
listen=tcp:0.0.0.0:18080 \
connect=tcp:127.0.0.1:8080
之后 curl http://<宿主-IP>:18080/ 转到容器内 8080。
拍快照 / 还原
lxc snapshot devbox before-upgrade
lxc restore devbox before-upgrade
lxc info devbox | grep -A 5 Snapshots
非常适合"我要装一个可能搞坏环境的东西,万一不行就回去"。
限制资源
lxc config set devbox limits.cpu 2
lxc config set devbox limits.memory 2GB
lxc config set devbox limits.memory.swap false
lxc restart devbox
模板化
# 把 devbox 当模板
lxc snapshot devbox base
lxc publish devbox/base --alias my-dev-base
# 之后随时拉一份新的出来
lxc launch my-dev-base devbox2
自动启动
lxc config set devbox boot.autostart true
lxc config set devbox boot.autostart.priority 10
与 Docker 对比
| 维度 | LXC (system container) | Docker (app container) |
|---|---|---|
| 进程数 | 多进程,有 init | 默认单进程(PID 1) |
| 文件系统 | 完整 distro | 极简 image |
| 启动速度 | 1-2 秒 | < 1 秒 |
| 生命周期 | 长(像 VM) | 短(每次启动是新实例) |
| 应用分发 | 不方便 | 主流(image registry) |
| 编排生态 | LXD cluster | Kubernetes、Swarm、Compose |
踩过的坑
- 默认 storage backend 是
dir(裸目录),性能差且不支持快照高效复制。
生产 / 重度使用换btrfs或zfs:sudo lxd init时选。 - 容器内 dmesg / mount 等命令可能权限不够 —— 这是 unprivileged container
的预期行为,不是 bug。需要的话lxc config set devbox security.privileged true,
但安全等同 root。 - LXD vs LXC:
apt install lxc装的是底层工具;建议直接snap install lxd
用更现代的 API。两者底层兼容但命令完全不同。 - Snap 版 LXD 升级时容器会随之重启,业务跑在 LXD 上的要避开升级窗口。
登录后参与评论。