在 LXC 容器里跑一个隔离的开发环境(比 Docker 更像虚拟机)

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(裸目录),性能差且不支持快照高效复制。
    生产 / 重度使用换 btrfszfssudo 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 上的要避开升级窗口。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。