在容器技术风靡的今天,很多人只知 Docker,却不了解容器的底层根基——Linux 内核提供的 Namespace(空间隔离)与 Cgroups(资源控制)。本文结合实战操作,带你从零理解容器本质,并用 LXC 亲手搭建容器,彻底搞懂 “容器到底是什么”。
一、容器的核心:不是 Docker,是 Linux 内核能力
很多初学者误以为 Docker 创造了容器,其实Docker 只是容器技术的封装工具,真正实现容器隔离与资源限制的,是 Linux 内核两大核心能力:
下面通过实战,一步步拆解这两大能力。
二、Namespace 空间隔离实战:让进程 “看不见” 宿主系统
Namespace 的作用是切割系统资源,让不同进程组拥有独立的运行视图。常用隔离类型:
- PID:进程号隔离
- Mount:文件系统挂载隔离
- Net:网络隔离
- UTS:主机名 / 域名隔离
- IPC:进程间通信隔离
- User:用户权限隔离
实战工具:unshare(创建独立 Namespace)、dd/mkfs/mount(文件操作)。
实战 1:PID 命名空间隔离
目标:让新进程看不到宿主系统的所有进程,仅显示自身空间内的进程。
# 创建独立PID Namespace,自动挂载proc,启动bash
unshare –fork –pid –mount-proc /bin/bash
# 执行ps -ef,仅看到当前bash,看不到宿主进程
ps -ef
# 退出隔离环境
exit
关键说明:
- –fork:必须新建子进程,否则会报内存分配错误。
- –mount-proc:自动挂载/proc,让ps/top命令正常显示隔离后的进程。
实战 2:Mount 挂载隔离
目标:在隔离空间内挂载磁盘,宿主系统完全不可见。
# 1. 新建Mount Namespace
unshare –mount –fork /bin/bash
# 2. 创建挂载目录
mkdir -p /data/tmpmount
# 3. 生成镜像文件并格式化为ext4
dd if=/dev/zero of=fdimage.img bs=8k count=10240
mkfs -t ext4 ./fdimage.img
# 4. 挂载到指定目录
mount ./fdimage.img /data/tmpmount
# 5. 在挂载目录创建文件
echo "Hello Namespace!" > /data/tmpmount/hello.txt
切换到宿主 Shell 查看:找不到挂载点与文件,完美实现文件系统隔离。
三、Cgroups 资源控制实战:给容器 “戴紧箍咒”
Cgroups(Control Groups)是 Linux 内核的资源管理器,可限制进程组的 CPU、内存、IO、进程数等资源。默认路径:/sys/fs/cgroup。
实战工具:stress(压力测试)、pidstat(资源监控)。
实战 1:内存资源限制(最大 20M)
# 1. 进入内存cgroup目录,创建控制组
cd /sys/fs/cgroup/memory
mkdir test_memory
# 2. 设置内存上限:20M = 20*1024*1024 = 20971520
echo 20971520 > test_memory/memory.limit_in_bytes
# 3. 启动stress进程,申请50M内存
stress -m 1 –vm-bytes 50M
# 4. 将stress进程加入控制组(替换为实际PID)
echo 进程PID > test_memory/tasks
结果:进程因内存超限被系统杀死(OOM),无法突破限制。
实战 2:CPU 资源限制(最大 30%)
# 1. 进入CPU cgroup目录,创建控制组
cd /sys/fs/cgroup/cpu
mkdir test_cpu
# 2. 设置CPU配额:30000/100000 = 30%
echo 30000 > test_cpu/cpu.cfs_quota_us
# 3. 启动stress占满CPU
stress -c 1
# 4. 将进程加入控制组
echo 进程PID > test_cpu/tasks
结果:CPU 使用率从 100% 降至 30% 左右,资源限制生效。
四、LXC 容器实战:用原生工具搭建容器
Docker 0.9 版本前基于 LXC 实现,后来改用libcontainer,但LXC 仍是最原生的容器实现,能帮我们理解容器的完整流程。
1. 安装 LXC(Ubuntu)
apt install lxc lxc-templates bridge-utils -y
systemctl status lxc
2. 检查内核支持
lxc-checkconfig
确保 Namespace、Cgroups、网络等功能全部enabled。
3. 创建并启动容器
# 创建Ubuntu容器
lxc-create -n lxchost1 -t ubuntu — -r xenial -a amd64
# 后台启动容器
lxc-start -n lxchost1 -d
# 查看容器状态
lxc-ls -f
# 查看容器详情(IP、PID、资源占用)
lxc-info -n lxchost1
4. 进入容器 & 验证隔离
# SSH进入容器(默认账号:ubuntu/ubuntu)
ssh ubuntu@容器IP
# 查看进程、挂载、主机名,均与宿主隔离
ps -ef
df -h
hostname
5. 停止 & 删除容器
lxc-stop -n lxchost1
lxc-destroy -n lxchost1
五、总结:容器本质一句话
容器 = Linux Namespace(隔离) + Cgroups(资源限制) + 独立根文件系统。
- Docker 只是把这三大能力封装成易用工具,降低使用门槛。
- 理解 Namespace 与 Cgroups,才能真正吃透容器、K8s 底层原理。
- LXC 让我们看到,没有 Docker,依然可以用原生 Linux 能力实现容器。
如果你是后端 / 运维 / 云原生学习者,一定要亲手跑一遍上述实战,彻底摆脱 “只会用 Docker,不懂底层” 的困境。




