LXC 容器常用命令与核心配置参数详解
摘要
LXC(Linux Containers)是 Linux 原生容器技术之一,常用于创建轻量级系统容器。相比 Docker 更偏应用容器的使用方式,LXC 更接近一台完整 Linux 系统的运行环境,适合需要 systemd、完整网络栈、资源隔离和宿主机目录挂载的场景。
本文整理 LXC 的常用命令、创建参数、网络配置、资源限制、安全隔离、启动运行、文件系统挂载、日志监控以及完整配置示例,方便快速查阅和落地使用。
目录
- Docker 与 LXC 常用命令对照
- 容器创建核心参数
- 存储相关配置
- 网络配置
- CPU、内存与磁盘 IO 限制
- 安全与隔离配置
- 启动与运行配置
- 挂载与文件系统配置
- 日志、环境变量与用户映射
- 常用命令参数速查
- 完整配置示例
- 总结
1. Docker 与 LXC 常用命令对照
如果你熟悉 Docker,可以先通过下面的对照表快速理解 LXC 的基本操作。
| Docker 命令 | LXC 等价命令 | 说明 |
|---|---|---|
docker run |
lxc-create + lxc-start |
创建并启动容器 |
docker ps |
lxc-ls -f |
查看容器列表和状态 |
docker exec -it |
lxc-attach |
进入容器执行命令 |
docker stop |
lxc-stop |
停止容器 |
docker rm |
lxc-destroy |
删除容器 |
docker inspect |
lxc-info |
查看容器详细信息 |
docker logs |
lxc-console -n NAME |
查看容器控制台输出 |
LXC 的操作通常会更显式。例如 Docker 的 docker run 会同时完成镜像拉取、容器创建和启动,而 LXC 中一般拆成 lxc-create 和 lxc-start 两步。
2. 容器创建核心参数
2.1 指定容器名称
-n 或 --name 用于指定容器名称。
bash
sudo lxc-create -n my-container -t ubuntu
容器名称建议满足以下规则:
- 在当前宿主机上保持唯一
- 只使用字母、数字、下划线和连字符
- 避免过长,通常控制在 64 个字符以内
- 名称会影响容器目录、配置文件路径和网络接口标识
2.2 指定模板
-t 或 --template 用于指定创建容器时使用的模板。
bash
sudo lxc-create -n my-container -t ubuntu
常见模板包括:
| 模板 | 说明 |
|---|---|
ubuntu |
创建 Ubuntu 容器 |
debian |
创建 Debian 容器 |
centos |
创建 CentOS 容器 |
fedora |
创建 Fedora 容器 |
busybox |
创建最小化系统容器 |
alpine |
创建 Alpine Linux 容器 |
download |
从镜像仓库下载系统镜像 |
模板脚本通常位于:
bash
/usr/share/lxc/templates/
2.3 模板参数传递
-- 是 LXC 命令参数和模板参数之间的分隔符。-- 后面的内容会传给模板脚本处理。
bash
sudo lxc-create -n my-container -t ubuntu -- -r 22.04 --arch amd64
Ubuntu 模板常用参数示例:
bash
sudo lxc-create -n ubuntu-container -t ubuntu -- \
-r 22.04 \
--arch amd64 \
--packages nginx \
--release jammy
常见模板参数说明:
| 参数 | 说明 |
|---|---|
-r, --release |
指定 Ubuntu 版本,例如 18.04、20.04、22.04 |
--arch |
指定系统架构,例如 amd64、i386、arm64 |
--packages |
创建容器时预安装软件包 |
--mirror |
指定软件包镜像源 |
--security-mirror |
指定安全更新镜像源 |
3. 存储相关配置
3.1 指定容器存储路径
-P 或 --path 用于指定容器存储路径。
bash
sudo lxc-create -n my-container -t ubuntu -P /custom/path
默认路径通常为:
bash
/var/lib/lxc/容器名
适用场景:
- 使用独立磁盘分区存储容器
- 将容器数据放在分布式存储中
- 按业务或环境规划磁盘空间
3.2 指定后端存储类型
-B 或 --backingstore 用于指定后端存储类型。
bash
sudo lxc-create -n my-container -t ubuntu -B btrfs
常见存储类型对比:
| 存储类型 | 特点 | 优势 | 劣势 |
|---|---|---|---|
dir |
普通目录 | 简单、兼容性好 | 占用空间大,不支持快照 |
btrfs |
Btrfs 文件系统 | 支持快照和写时复制 | 依赖 Btrfs 文件系统 |
zfs |
ZFS 文件系统 | 企业级特性丰富,快照能力强 | 资源占用较高,学习成本高 |
lvm |
LVM 逻辑卷 | 卷管理灵活 | 配置相对复杂 |
overlayfs |
分层存储 | 节省空间,启动较快 | 部分场景性能略低 |
示例:
bash
# 使用 Btrfs 创建容器
sudo lxc-create -n my-container -t ubuntu -B btrfs
# 创建快照
sudo lxc-snapshot -n my-container
# 使用 OverlayFS 节省空间
sudo lxc-create -n my-container -t ubuntu -B overlayfs
4. 网络配置
LXC 的网络通常在容器配置文件中设置,配置文件路径一般为:
bash
/var/lib/lxc/容器名/config
4.1 常见网络类型
bash
# 虚拟以太网,最常用
lxc.net.0.type = veth
# 无网络
lxc.net.0.type = none
# 空网络
lxc.net.0.type = empty
# 物理网络接口
lxc.net.0.type = phys
# VLAN 网络
lxc.net.0.type = vlan
# MAC 地址虚拟化
lxc.net.0.type = macvlan
# 网桥模式
lxc.net.0.type = bridge
4.2 网桥与接口配置
bash
# 连接到 lxcbr0 网桥
lxc.net.0.link = lxcbr0
# 连接到 virbr0 网桥
lxc.net.0.link = virbr0
# 直接连接物理接口
lxc.net.0.link = eth0
# 启动网络接口
lxc.net.0.flags = up
# 指定 MAC 地址
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
4.3 IP 与网关配置
bash
# IPv4 地址
lxc.net.0.ipv4.address = 192.168.1.100/24
# IPv6 地址
lxc.net.0.ipv6.address = 2001:db8::100/64
# IPv4 网关
lxc.net.0.ipv4.gateway = 192.168.1.1
# IPv6 网关
lxc.net.0.ipv6.gateway = 2001:db8::1
4.4 多网卡配置
bash
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.1.type = veth
lxc.net.1.link = docker0
5. CPU、内存与磁盘 IO 限制
资源限制通常通过 cgroup 完成。需要注意的是,不同发行版、内核版本和 LXC 版本对 cgroup v1、cgroup v2 的配置项支持存在差异,实际使用时应以当前系统支持的配置项为准。
5.1 CPU 限制
bash
# 绑定 CPU 核心:使用 CPU 0-3
lxc.cgroup.cpuset.cpus = 0-3
# 使用指定核心
lxc.cgroup.cpuset.cpus = 0,2,4,6
# CPU 份额,默认通常为 1024
lxc.cgroup.cpu.shares = 512
# CPU 时间周期,单位微秒
lxc.cgroup.cpu.cfs_period_us = 100000
# CPU 配额,50000/100000 表示约 0.5 个 CPU 核心
lxc.cgroup.cpu.cfs_quota_us = 50000
运行中调整示例:
bash
# 限制容器使用 CPU 0 和 CPU 1
sudo lxc-cgroup -n my-container cpuset.cpus 0,1
# 限制容器使用约 25% CPU
sudo lxc-cgroup -n my-container cpu.cfs_quota_us 25000
sudo lxc-cgroup -n my-container cpu.cfs_period_us 100000
5.2 内存限制
bash
# 限制内存为 1GB
lxc.cgroup.memory.limit_in_bytes = 1G
# 限制内存为 512MB
lxc.cgroup.memory.limit_in_bytes = 512M
# 内存 + Swap 总限制为 2GB
lxc.cgroup.memory.memsw.limit_in_bytes = 2G
# 内存软限制
lxc.cgroup.memory.soft_limit_in_bytes = 512M
# 内存预留
lxc.cgroup.memory.reservation = 256M
# 交换倾向,范围 0-100
lxc.cgroup.memory.swappiness = 60
运行中调整示例:
bash
# 设置 1GB 内存限制
sudo lxc-cgroup -n my-container memory.limit_in_bytes 1G
# 限制内存 + Swap 总量为 1GB
sudo lxc-cgroup -n my-container memory.memsw.limit_in_bytes 1G
5.3 磁盘 IO 限制
bash
# 磁盘 IO 权重,默认通常为 1000
lxc.cgroup.blkio.weight = 500
# 指定设备 IO 权重
lxc.cgroup.blkio.weight_device = 8:0 500
# 限制读取速度为 1MB/s
lxc.cgroup.blkio.throttle.read_bps_device = 8:0 1048576
# 限制写入速度为 1MB/s
lxc.cgroup.blkio.throttle.write_bps_device = 8:0 1048576
# 限制读取 IOPS
lxc.cgroup.blkio.throttle.read_iops_device = 8:0 1000
# 限制写入 IOPS
lxc.cgroup.blkio.throttle.write_iops_device = 8:0 1000
6. 安全与隔离配置
6.1 Capabilities 控制
Linux Capabilities 用于细分 root 权限。通过删除不必要的能力,可以降低容器逃逸或误操作风险。
bash
# 删除特定能力
lxc.cap.drop = sys_admin net_raw mknod
# 只保留特定能力
lxc.cap.keep = net_admin sys_chroot
常见能力说明:
| 能力 | 说明 |
|---|---|
sys_admin |
系统管理相关权限,能力范围很大,通常建议谨慎授予 |
net_admin |
网络管理权限 |
net_raw |
原始套接字访问权限 |
mknod |
创建设备文件权限 |
6.2 Namespace 配置
bash
# 保留网络命名空间
lxc.namespace.keep = NET
# 创建新的 UTS 命名空间
lxc.namespace.clone = NEWUTS
# 设置容器主机名
lxc.uts.name = my-container
lxc.uts.hostname = my-container
6.3 AppArmor 与 SELinux
bash
# 使用默认 AppArmor 配置
lxc.apparmor.profile = lxc-container-default
# 不使用 AppArmor,生产环境需谨慎
lxc.apparmor.profile = unconfined
# SELinux 上下文示例
lxc.selinux.context = system_u:system_r:lxc_t:s0:c0,c1023
6.4 设备访问控制
bash
# 允许访问所有设备,风险较高
lxc.cgroup.devices.allow = a
# 允许访问 /dev/null
lxc.cgroup.devices.allow = c 1:3 rwm
# 允许访问 /dev/sda
lxc.cgroup.devices.allow = b 8:0 rwm
# 默认拒绝所有设备,再按需放行
lxc.cgroup.devices.deny = a *
lxc.cgroup.devices.allow = c 1:3 rwm
7. 启动与运行配置
7.1 启动容器
bash
# 前台启动
sudo lxc-start -n my-container
# 后台启动
sudo lxc-start -n my-container -d
# 前台启动,不分离
sudo lxc-start -n my-container -F
# 使用指定配置文件启动
sudo lxc-start -n my-container --rcfile /custom/config
7.2 自动启动与停止信号
bash
# 开机自动启动
lxc.start.auto = 1
# 启动延迟,单位秒
lxc.start.delay = 5
# 启动顺序
lxc.start.order = 10
# 容器 init 命令
lxc.init.cmd = /sbin/init
# 启动用户和用户组
lxc.init.uid = 0
lxc.init.gid = 0
# 停止、重启和关机信号
lxc.signal.halt = SIGPWR
lxc.signal.reboot = SIGINT
lxc.signal.stop = SIGTERM
8. 挂载与文件系统配置
8.1 挂载宿主机目录或文件
bash
# 挂载宿主机目录到容器
lxc.mount.entry = /opt/data /var/lib/data none bind,create=dir 0 0
# 只读挂载 hosts 文件
lxc.mount.entry = /etc/hosts /etc/hosts none bind,ro 0 0
# 只读挂载 DNS 配置
lxc.mount.entry = /etc/resolv.conf /etc/resolv.conf none bind,ro 0 0
# 挂载 proc
lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
# 挂载 sysfs
lxc.mount.entry = sysfs sys sysfs ro 0 0
# 挂载 tmpfs
lxc.mount.entry = tmpfs /run tmpfs nodev,nosuid,size=512m,mode=1777 0 0
常见挂载选项:
| 选项 | 说明 |
|---|---|
bind |
绑定挂载宿主机路径 |
ro |
只读 |
rw |
读写,默认行为 |
create=dir |
目标目录不存在时创建目录 |
create=file |
目标文件不存在时创建文件 |
8.2 文件系统限制
bash
# 文件描述符限制,格式为软限制:硬限制
lxc.prlimit.nofile = 65536:65536
# 进程数限制
lxc.prlimit.nproc = 4096:8192
# 内存锁定限制
lxc.prlimit.memlock = 134217728:134217728
# 核心转储大小限制
lxc.prlimit.core = 0:unlimited
9. 日志、环境变量与用户映射
9.1 日志配置
bash
# 日志级别:DEBUG、INFO、WARN、ERROR
lxc.log.level = INFO
# 日志文件
lxc.log.file = /var/log/lxc/my-container.log
# 日志大小限制
lxc.log.size = 1M
# 控制台日志
lxc.console.logfile = /var/log/lxc/my-container-console.log
lxc.console.size = 1M
# 启用内核消息
lxc.kmsg = 1
9.2 环境变量
bash
lxc.environment = http_proxy=http://proxy.example.com:8080
lxc.environment = https_proxy=http://proxy.example.com:8080
lxc.environment = no_proxy=localhost,127.0.0.1
lxc.environment = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
lxc.environment = LANG=en_US.UTF-8
lxc.environment = LC_ALL=en_US.UTF-8
9.3 用户映射与无特权容器
bash
# 容器内用户 ID 映射
lxc.idmap = u 0 100000 65536
# 容器内用户组 ID 映射
lxc.idmap = g 0 100000 65536
# 无特权容器相关配置
lxc.include = /usr/share/lxc/config/common.conf
lxc.include = /usr/share/lxc/config/userns.conf
10. 常用命令参数速查
10.1 lxc-create
bash
sudo lxc-create [OPTIONS] -n NAME -t TEMPLATE [-- TEMPLATE_OPTIONS]
常用参数:
| 参数 | 说明 |
|---|---|
-n, --name NAME |
容器名称 |
-t, --template TEMPLATE |
模板名称 |
-P, --path PATH |
存储路径 |
-B, --backingstore TYPE |
后端存储类型 |
-f, --config FILE |
配置文件 |
-r, --release RELEASE |
发行版本 |
--arch ARCH |
系统架构 |
--packages PKGS |
预安装软件包 |
--help |
查看帮助信息 |
--version |
查看版本信息 |
10.2 lxc-start
bash
sudo lxc-start [OPTIONS] -n NAME
常用参数:
| 参数 | 说明 |
|---|---|
-n, --name NAME |
容器名称 |
-d, --daemon |
后台运行 |
-F, --foreground |
前台运行 |
-p, --pidfile FILE |
指定 PID 文件 |
-f, --rcfile FILE |
指定配置文件 |
-s, --define KEY=VAL |
临时设置配置参数 |
--share-net NAME |
共享网络命名空间 |
--share-ipc NAME |
共享 IPC 命名空间 |
--share-uts NAME |
共享 UTS 命名空间 |
10.3 lxc-stop
bash
sudo lxc-stop [OPTIONS] -n NAME
常用参数:
| 参数 | 说明 |
|---|---|
-n, --name NAME |
容器名称 |
-r, --reboot |
重启容器 |
-w, --nowait |
不等待容器停止 |
-t, --timeout SECONDS |
指定超时时间 |
-f, --force |
强制停止 |
-k, --kill |
直接杀死容器进程 |
11. 完整配置示例
下面是一个较完整的 LXC 容器配置文件示例,可作为实际配置时的参考。
配置文件路径:
bash
/var/lib/lxc/my-container/config
示例配置:
bash
# 容器标识
lxc.uts.name = my-container
lxc.uts.hostname = my-container
# 网络配置
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
lxc.net.0.ipv4.address = 192.168.1.100/24
lxc.net.0.ipv4.gateway = 192.168.1.1
# 存储配置
lxc.rootfs.path = dir:/var/lib/lxc/my-container/rootfs
lxc.rootfs.options = rw
# 启动配置
lxc.init.cmd = /sbin/init
lxc.start.auto = 1
lxc.start.delay = 5
lxc.start.order = 10
# 资源限制
lxc.cgroup.cpuset.cpus = 0-3
lxc.cgroup.cpu.shares = 512
lxc.cgroup.cpu.cfs_quota_us = 50000
lxc.cgroup.memory.limit_in_bytes = 1G
lxc.cgroup.memory.memsw.limit_in_bytes = 2G
lxc.cgroup.blkio.weight = 500
# 安全配置
lxc.cap.drop = sys_admin net_raw
lxc.apparmor.profile = lxc-container-default
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
lxc.cgroup.devices.allow = c 1:7 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.deny = a
# 挂载配置
lxc.mount.entry = /opt/data /var/lib/data none bind,create=dir 0 0
lxc.mount.entry = /etc/hosts /etc/hosts none bind,ro 0 0
lxc.mount.entry = /etc/resolv.conf /etc/resolv.conf none bind,ro 0 0
lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry = sysfs sys sysfs ro 0 0
# 日志配置
lxc.log.level = INFO
lxc.log.file = /var/log/lxc/my-container.log
lxc.log.size = 1M
# 环境变量
lxc.environment = LANG=en_US.UTF-8
lxc.environment = PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 系统配置
lxc.tty.max = 4
lxc.pts.max = 1024
lxc.mount.auto = proc:mixed sys:mixed cgroup:mixed
12. 总结
LXC 的配置项覆盖了容器生命周期的多个方面,包括创建模板、存储路径、网络接入、资源限制、安全隔离、目录挂载、日志记录和用户映射等。
实际使用时建议遵循以下原则:
- 开发测试环境可以先使用默认模板和默认存储方式快速创建容器
- 生产环境应明确配置 CPU、内存、磁盘 IO 和日志路径
- 尽量使用无特权容器,并限制不必要的 Capabilities 和设备访问
- 挂载宿主机目录时优先使用只读模式,按需放开写权限
- cgroup 配置项需要结合当前系统的 LXC 版本和内核版本验证
合理配置这些参数,可以让 LXC 容器在安全性、可维护性和资源可控性之间取得更好的平衡。