揭开Docker底层面纱-Namespace隔离与cgroups控制
揭开 Docker 底层面纱Namespace 隔离与 cgroups 控制 目录一、核心认知隔离与控制是内核能力二、空间隔离实战Namespace1. 基础命令2. 实战一PID 隔离3. 实战二Mount 隔离三、资源控制实战cgroups1. 基础工具2. cgroups 信息查看3. 实战一内存控制4. 实战二CPU 控制四、LXC 容器实战1. LXC 常用命令2. 安装 LXC3. LXC 容器操作实战一、核心认知隔离与控制是内核能力在动手之前先明确一个核心认知隔离能力并非 Docker 提供而是操作系统内核提供的基本能力。Namespace 负责空间隔离cgroups 负责资源控制LXC 是早期把这些能力封装起来的工具而 Docker 是 LXC 的增强版——它的价值在于易用性和镜像设计而非底层隔离/控制技术本身。本篇通过三个实战用最原始的内核命令亲手验证这些能力实战使用的内核能力验证目标空间隔离Namespaceunshare 命令PID 隔离、Mount 隔离资源控制cgroups/sys/fs/cgroup内存限制、CPU 限制LXC 容器Namespace cgroupslxc-* 命令容器的另一种实现二、空间隔离实战Namespace1. 基础命令空间隔离实战需要掌握几个 Linux 基础命令命令功能关键参数dd读取/转换/输出数据if输入文件、of输出文件、bs块大小、count块数mkfs在设备上创建文件系统格式化-t指定文件系统类型如 ext4df显示磁盘使用情况-h人可读、-T显示文件系统类型mount加载文件系统到挂载点-t类型、-o选项如 loop/ro/rwunshare使用与父程序不共享的命名空间运行程序-iIPC、-mMount、-nNet、-pPID、-uUTS、-Uuser、--fork、--mount-proc2. 实战一PID 隔离目标通过unshare创建一个新的 PID Namespace观察进程隔离效果。# 1. 主机执行 ps -efPID 1 为 init 进程ps-ef# 2. 创建新 PID Namespaceunshare--fork--pid--mount-proc /bin/bash关键知识点--fork新建 bash 进程。如果不加会报Cannot allocate memory。--mount-proc挂载 /proc使 top/ps 在新 namespace 中正常工作。# 3. 在新 namespace 中执行 ps -efps-ef# 此时进程空间已隔离bash 成为启动进程PID 1看不到主机其他进程# 4. 退出exit3. 实战二Mount 隔离目标通过unshare创建 Mount Namespace在隔离环境中创建并挂载磁盘镜像验证主机看不到隔离环境的挂载。窗口 A主机# 查看主机默认磁盘挂载df-h窗口 B隔离环境# 1. 创建 Mount Namespaceunshare--mount--fork/bin/bash# 2. 创建挂载目录mkdir-p/data/tmpmount# 3. 创建磁盘镜像文件80MBddif/dev/zerooffdimage.imgbs8kcount10240# 4. 格式化为 ext4mkfs-text4 ./fdimage.img# 5. 挂载mount./fdimage.img /data/tmpmount# 6. 写入文件echoHello world!/data/tmpmount/hello.txtcat/data/tmpmount/hello.txt# 能读取# 7. 查看挂载df-h# 窗口 B 有 /dev/loop0 挂载对比验证# 窗口 A主机执行 df -h没有 /dev/loop0 挂载# 窗口 A 执行 cat /data/tmpmount/hello.txt报 No such file or directory# 窗口 B 能读取窗口 A 不能 → Mount 隔离验证成功# 退出隔离环境exit三、资源控制实战cgroups1. 基础工具资源控制实战需要两个监控和压力测试工具工具功能关键参数安装pidstat监控进程的 CPU/内存/线程/IO 占用-uCPU、-r内存、-dIO、-p指定PID、-C按进程名apt install sysstat -y或yum install sysstat -ystress压力测试工具CPU/Memory/IO/磁盘-cCPU、-m内存、--vm-bytes内存大小、--vm-keep、-t超时apt install stress -y或yum install stress -y2. cgroups 信息查看# 1. 查看版本cgroup2 表示支持 v2cat/proc/filesystems|grepcgroup# v2 判断方法stat-fc%T /sys/fs/cgroup/# 输出 cgroup2fs 表示 v2tmpfs 表示 v1# 2. 查看子系统# v1cat/proc/cgroups# 输出cpuset cpu cpuacct blkio memory devices freezer 等# v2cat/sys/fs/cgroup/cgroup.controllers# 输出cpuset cpu io memory 等# 3. 查看挂载信息mount|grepcgroup# 默认存储在 /sys/fs/cgroup# 4. 查看进程的 cgroup 限制cat/proc/$$/cgroup3. 实战一内存控制cgroup v1 操作# 1. 进入 memory 子系统目录创建 test_memory自动生成配置文件cd/sys/fs/cgroup/memorymkdirtest_memory# 2. 配置策略最大 20Mexpr20\*1024\*1024# 计算得 20971520echo20971520test_memory/memory.limit_in_bytes# 3. 窗口 B启动消耗 50M 内存的进程stress-m1--vm-bytes 50M# 4. 窗口 B用 pidstat 查看pidstat-r-Cstress-pALL110000# 5. 窗口 C将进程 PID 移入 cgroupechoPIDtest_memory/tasks# 6. 结果进程因无法申请足够内存而退出cgroup v2 操作# 1. 确认 memory 支持cat/sys/fs/cgroup/cgroup.controllers# 2. 创建子 cgroupmkdir/sys/fs/cgroup/test_memory# 3. 配置 20Mecho20M/sys/fs/cgroup/test_memory/memory.max# 4. 启动 stress 并查看stress-m1--vm-bytes 50M pidstat-r-Cstress-pALL110000# 5. 移入 cgroupechoPID/sys/fs/cgroup/test_memory/cgroup.procs# 6. 结果进程消失退出4. 实战二CPU 控制cgroup v1 操作# 1. 进入 cpu 子系统目录创建 test_cpucd/sys/fs/cgroup/cpumkdirtest_cpu# 2. 窗口 B模拟 CPU 100% 任务stress-c1# 3. 查看 CPU 使用率看到 100%pidstat-u-Cstress-pALL110000# 4. 窗口 C设置 30%# CPU 使用率 cfs_quota_us / cfs_period_us# cfs_period_us 默认 100000cfs_quota_us 设 30000 即 30%echo30000test_cpu/cpu.cfs_quota_us# 5. 移入进程echoPIDtest_cpu/tasks# 6. 结果CPU 使用率由 100% 降为 30%cgroup v2 操作# 1. 创建子 cgroupmkdir/sys/fs/cgroup/test_cpu# 2. 启动 stress 并查看100%stress-c1pidstat-u-Cstress-pALL110000# 3. 设 30%格式quota periodecho30000 100000/sys/fs/cgroup/test_cpu/cpu.max# 4. 移入 cgroupechoPID/sys/fs/cgroup/test_cpu/cgroup.procs# 5. 结果CPU 降为 30%总结Docker 本质也是调用 cgroups API 完成资源管理Docker 的易用性和镜像设计更人性化。以上操作揭示了 Docker-m、--cpus等参数的底层原理。四、LXC 容器实战 Docker 自 0.9 版本起引入 libcontainer 替代 LXC。LXC 这项技术随系统升级几乎无人维护这里只是用来理解docker 并非容器的唯一实现。1. LXC 常用命令命令功能lxc-checkconfig检查系统环境是否满足容器要求lxc-create -n NAME -t TEMPLATE_NAME创建容器lxc-start -n NAME -d启动容器lxc-ls -f列出所有容器-f 打印常用信息lxc-info -n NAME查看容器信息lxc-attach --nameNAME [-- COMMAND]进入容器执行命令lxc-stop -n NAME停止容器lxc-destroy -n NAME删除停机状态的容器2. 安装 LXCUbuntu 安装# 卸载旧版systemctl status lxc# 如有容器先清理lxc-stop / lxc-destroyapt-getpurge --auto-remove lxc lxc-templates# 安装aptinstalllxc lxc-templates bridge-utils-y# 检查systemctl status lxcCentOS 安装# 卸载旧版yum remove lxc lxc-templates lxc-libs lxc-extra libvirtdebootstrap# 配置 EPEL 源yum-yinstallepel-release# 安装yum-yinstalllxc lxc-templates bridge-utils lxc-libs libcgroup libvirt lxc-extradebootstrap# 启动systemctl start lxc systemctl start libvirtd3. LXC 容器操作实战# 1. 检查 lxc 是否运行systemctl status lxc# 2. 检查 lxc 功能支持查看 Namespaces/Cgroups/Misc 等内核特性是否 enabledlxc-checkconfig# 3. 查看容器模板ls/usr/share/lxc/templates/# 输出lxc-alpine lxc-centos lxc-debian lxc-ubuntu lxc-download 等# 4. 创建容器Ubuntu 上建 ubuntu 容器lxc-create-tubuntu-nlxchost1 ---rxenial-aamd64# CentOS 上建 centos 容器lxc-create -t centos -n lxchost1# Ubuntu 上建 centos 容器lxc-create -t download -n lxchost1 -- --distcentos --release7 --archamd64# 5. 容器目录说明# 容器放在 /var/lib/lxc/容器名/根文件系统在 rootfs/# 下载缓存在 /var/cache/lxc# 6. 查看容器lxc-ls-f# 7. 启动容器lxc-start-nlxchost1-d# 看到 IP 如 10.0.3.248# 8. 查看详情lxc-info-nlxchost1# 输出 State/PID/IP/CPU/Memory/网络统计# 9. ssh 进入容器sshubuntu10.0.3.248# 验证隔离性ip addr、uname、ll /、df -h、ps -ef 与宿主机不同# 10. 容器外执行命令lxc-attach-nlxchost1 --clear-env --echoHello bit# 11. 停止容器lxc-stop-nlxchost1# 12. 删除容器lxc-destroy-nlxchost1

相关新闻

STM32L496 HAL库驱动OV7670:DCMI接口配置与图像采集实战

STM32L496 HAL库驱动OV7670:DCMI接口配置与图像采集实战

简介:本资源是面向嵌入式视觉开发者的STM32L496平台DCMI摄像头驱动实战工程,聚焦超低功耗Cortex-M4芯片与OV7670/OV7725 CMOS传感器的HAL库级集成方案,适用于智能监控、机器人视觉、边缘图像采集等场景。压缩包共774个文件,涵盖38…

2026/10/24 0:37:02 阅读更多 →
安卓原生+AIDL构建高可靠零售收银系统

安卓原生+AIDL构建高可靠零售收银系统

简介:这是一套面向新零售连锁门店场景的安卓原生收银系统开源实现,适用于Android开发工程师、智慧零售解决方案开发者及POS系统二次定制人员,解决多门店统一收银、硬件外设集成与业态融合等实际问题。资源包共337个文件,含131个Ja…

2026/10/24 18:38:52 阅读更多 →
FPGA图像细节增强DDE系统:毕设级工程实现方案

FPGA图像细节增强DDE系统:毕设级工程实现方案

简介:本资源是一套完整的FPGA图像处理毕业设计实现方案,面向电子信息、嵌入式与数字图像处理方向的本科生及毕设指导教师,聚焦DDE(数字细节增强)算法在硬件平台上的落地应用。方案基于Altera EP4CE10F17C8开发板&#…

2026/10/31 12:51:28 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻