欢迎光临
我们一直在努力

从内核到容器:Linux Namespace、Cgroups 与 LXC 实战全解

在容器技术风靡的今天,很多人只知 Docker,却不了解容器的底层根基——Linux 内核提供的 Namespace(空间隔离)与 Cgroups(资源控制)。本文结合实战操作,带你从零理解容器本质,并用 LXC 亲手搭建容器,彻底搞懂 “容器到底是什么”。

一、容器的核心:不是 Docker,是 Linux 内核能力

很多初学者误以为 Docker 创造了容器,其实Docker 只是容器技术的封装工具,真正实现容器隔离与资源限制的,是 Linux 内核两大核心能力:

  • Namespace:实现进程、网络、挂载、主机名等环境隔离,让容器看起来像独立系统。
  • Cgroups:实现 CPU、内存、磁盘 IO 等资源配额控制,避免容器抢占系统资源。
  • 下面通过实战,一步步拆解这两大能力。


    二、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,不懂底层” 的困境。

    赞(0)
    未经允许不得转载:171主机测评 » 从内核到容器:Linux Namespace、Cgroups 与 LXC 实战全解
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址