深入解析:Docker 容器如何实现文件系统与资源的多维隔离?
目录
- 一、RootFs
- 1. Docker 镜像与文件系统层
- 2. RootFs 与容器隔离的意义
- 二、Linux Namespace
- 1. 进程命名空间
- 1.1 `lsns` 命令说明
- 1.2 查看“祖先进程”命名空间
- 1.3 查看当前用户进程命名空间
- 2. 容器进程命名空间
- 2.1 查看容器进程命名空间列表
- 2.2 容器进程命名空间的具体体现
- 三、cgroups
- 1. cpu 子系统
- 1.1 CFS (Completely Fair Scheduler)
- 1.2 RT (Real-time Scheduler)
- 1.3 示例
- 2. cpuset 子系统
- 3. cpuacct 子系统
- 4. memory 子系统
- 示例
- 5. blkio 子系统
- 6. devices 子系统
- 7. freezer 子系统
- 8. net_cls 子系统
- 9. net_prio 子系统
- 10. perf_event
- 11. hugetlb
- 总结
一、RootFs
在传统的 Linux 系统中,rootfs(根文件系统)就是系统的“根”目录,一般位于 /
,其下包含 /bin
、/dev
、/etc
等常见目录结构。
在容器中,则通过镜像(Image)+**容器层(Container Layer)**的组合来提供容器自身的根文件系统,这个容器的根文件系统就是rootfs
,与宿主机的 rootfs 相对隔离。
1. Docker 镜像与文件系统层
- **镜像(Image)**由多层只读层(read-only layers)构成,利用了 Union FS 或 OverlayFS 等联合文件系统技术。
- **容器层(Container Layer)**是该镜像之上的可写层(read-write layer)。容器运行时,对文件的修改都会写入到这个容器层中,不会影响只读层的内容。
2. RootFs 与容器隔离的意义
- 当启动一个容器时,容器看到的“根文件系统”并非与宿主机相同,而是来自镜像 + 容器层组合形成的 rootfs。
- 对于容器内部的进程来说,
/
就是容器自身的根目录,与宿主机的/
相互独立(尽管底层还是同一个内核)。 - 这种文件系统级别的隔离为容器提供了和宿主机隔离的外观,不同容器之间也不会直接污染彼此的文件系统。
二、Linux Namespace
Linux Namespace 是容器隔离的核心机制之一。Namespace 的主要作用是将系统资源进行“分名字空间”隔离,如进程(PID)、网络(NET)、文件系统挂载(MOUNT)、用户(USER)、IPC 等,从而让容器“以为”它拥有自己独立的环境。
1. 进程命名空间
1.1 lsns
命令说明
lsns
是 Linux 提供的一个查看系统中命名空间信息的命令。可以用lsns
查看当前系统里所有命名空间,如lsns -t pid
可以查看 PID 命名空间,lsns -t net
查看网络命名空间等。- 常见列示信息包含:
- NS TYPE: 命名空间类型(如
pid
、net
、mnt
、uts
、ipc
、user
等)。 - NSID: 命名空间 ID,一般可以在
/proc/pid/ns
路径中看到相应符号链接。 - PID: 对应的进程号。
- Command: 该命名空间对应进程的启动命令。
- NS TYPE: 命名空间类型(如
1.2 查看“祖先进程”命名空间
在 Linux 中,每个进程都有对应的命名空间引用(指针)。如果想要查看某个进程(比如 PID=1 或者宿主机上的某个 PID)的命名空间,可以通过:
列出系统所有命名空间
sudo lsns --output0all
ls -l /proc/<PID>/ns
这会展示对应的符号链接,比如:
lrwxrwxrwx 1 root root 0 Jan 1 00:00 /proc/1/ns/pid -> pid:[4026531836]
这样就能看到 pid:[4026531836]
对应的命名空间 ID。通常 PID=1(系统的 init 或 systemd)会在宿主机的最初始 namespace 中。
1.3 查看当前用户进程命名空间
直接对你当前 shell 的 PID 进行查看:
echo $$
# 假设输出为 12345
ls -l /proc/12345/ns
就能看到你当前 shell 进程所使用的 namespace。
2. 容器进程命名空间
容器之所以能够让其内部进程彼此隔离,主要原因之一是 Docker(或其他容器运行时)在启动容器进程时,会为该进程创建或加入单独的命名空间(PID/NET/IPC/UTS 等)。
2.1 查看容器进程命名空间列表
假设我们有一个正在运行的容器,可以先找到容器对应的“容器进程”:
docker ps
docker inspect <container_id> | grep "Pid"
然后拿到对应的 PID,比如是 23456。接着:
ls -l /proc/23456/ns
就能看到容器进程使用的所有 namespace 绑定信息。
2.2 容器进程命名空间的具体体现
- PID Namespace
容器内部查看到的进程号(PID)从 1 开始,而在宿主机上,这个容器的进程是一个完全不同的 PID 值。容器内部的“PID=1”通常是容器内的 init 进程。 - Network Namespace
容器有自己单独的网卡配置(如eth0
),与宿主机是隔离的。通过容器的 network namespace,可以将容器网络与宿主机网络解耦(或进行端口映射)。 - Mount Namespace
容器有自己挂载的文件系统视图,比如/
是容器自己的 rootfs。与宿主机的挂载点不同。 - IPC Namespace
容器之间的共享内存、消息队列等 IPC 机制互不影响。 - UTS Namespace
容器可以有自己独立的 hostname。容器内hostname
与宿主机可以不同。
借助这些命名空间,容器可以呈现一个与宿主机几乎隔离的操作系统视图。
三、cgroups
cgroups (control groups) 是 Linux 提供的另一项关键特性,用于对系统资源进行“配额、限制、监控、隔离”。Docker 容器通过将容器进程加入到相应的 cgroup,来限制其对 CPU、内存、IO 等资源的使用或进行统计。
cgroups 是一个可插拔的框架,常见的子系统包括:
- cpu
- cpuset
- cpuacct
- memory
- blkio
- devices
- freezer
- net_cls
- net_prio
- perf_event
- hugetlb
等。
下面分别简要介绍这些子系统在容器隔离中的作用或使用示例。
1. cpu 子系统
cpu
子系统主要用于限制或分配 CPU 时间片给某个 cgroup 内进程。让我们来看看常见的调度器和示例。
1.1 CFS (Completely Fair Scheduler)
- Linux 默认的 CPU 调度器。可通过
cpu.shares
、cpu.cfs_period_us
、cpu.cfs_quota_us
等文件对 CPU 使用进行相对或绝对限额设置。 - 例如要限制某个 cgroup 的进程只能使用“相当于一个 CPU 核心”的计算量,可以在
cpu.cfs_period_us
= 100000(默认100ms)和cpu.cfs_quota_us
= 100000 之间做设置,这样就大致等价于 1 core。
1.2 RT (Real-time Scheduler)
- RT 调度针对实时任务,可以用来做实时优先级的资源控制。不过容器中常见应用较少直接动用 RT 调度。
1.3 示例
在手动配置 cgroup 时,可能会:
- 创建目录:
mkdir /sys/fs/cgroup/cpu/test_cgroup
- 写入一些限制:
表示此 cgroup 一次调度周期内(100ms),只能用 200ms CPU 时间,相当于可以使用 2 核的 CPU 时间。echo 200000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.cfs_quota_us echo 100000 > /sys/fs/cgroup/cpu/test_cgroup/cpu.cfs_period_us
- 把某个进程写入 tasks:
该进程的 CPU 使用就受限于此组的规则。echo <pid> > /sys/fs/cgroup/cpu/test_cgroup/tasks
Docker 在启动容器时会自动做这些事情,如 --cpus
、--cpuset-cpus
等参数。
2. cpuset 子系统
cpuset
子系统允许指定某些 CPU 核、某些内存节点给特定的 cgroup。- 比如可以指定容器只能在 CPU 0 和 1 上运行,或者只能从 NUMA 节点0分配内存。
- Docker 对应的参数是
--cpuset-cpus="0-1"
之类。
3. cpuacct 子系统
cpuacct
用于统计某个 cgroup 内进程的 CPU 使用情况(用户态、内核态占用总时长),只做统计不做限制。- Docker 可以通过这个子系统查看容器的 CPU 使用状态。
4. memory 子系统
memory
子系统用于限制和统计进程的内存使用,包括物理内存和 swap。
- 常见的控制文件:
memory.limit_in_bytes
:该 cgroup 最大物理内存限制。memory.memsw.limit_in_bytes
:物理内存 + swap 限制(如果启用 swap 记账)。
- 通过设置这些值,可防止某些进程用光系统所有内存。
示例
- 创建 cgroup:
mkdir /sys/fs/cgroup/memory/test_mem
- 设置限制:
echo 524288000 > /sys/fs/cgroup/memory/test_mem/memory.limit_in_bytes # 500MB
- 将进程加入:
这样该进程占用内存在超过 500MB 时可能会触发 OOM(Out Of Memory)动作。echo <pid> > /sys/fs/cgroup/memory/test_mem/tasks
5. blkio 子系统
blkio
(Block IO) 用于限制进程的块设备 IO 速率,比如磁盘读写速度。- 可以设置读取速率、写入速率的限制。对需要在容器层面做 IO QoS 的场景很有帮助。
6. devices 子系统
devices
子系统可以控制某个 cgroup 中的进程可以访问哪些设备、只能读或写、或完全禁止访问等。- 容器通常为了安全,会只允许访问少数必要设备(比如
/dev/null
、/dev/random
等)。
7. freezer 子系统
freezer
子系统提供了把 cgroup 内进程“冻结/解冻”的功能。- 可以把某个 cgroup 的状态设置为
FROZEN
,则该组内所有进程都挂起,等到切回THAWED
才继续运行。
8. net_cls 子系统
net_cls
可以为网络数据包打上一个分类标识(classid),配合 tc(traffic control)做网络流量整形或带宽控制。
9. net_prio 子系统
net_prio
子系统可以为 cgroup 中的进程设置网络优先级(priority),从而在同一台宿主机上的容器间做网络流量优先级区分。
10. perf_event
perf_event
子系统方便对一组进程进行性能计数器(performance counter)的监控,比如 CPU cycle、cache miss 等。
11. hugetlb
hugetlb
用于管理大页内存(Huge Pages)。可以限制某个 cgroup 使用多少大页内存。
总结
通过 RootFs、Linux Namespace 和 cgroups 的巧妙组合,Docker 容器能够在同一个 Linux 内核上运行,却拥有与宿主机和其他容器相对独立的文件系统、进程空间、网络环境、IPC、以及严格的资源配额/限制。这为容器提供了接近虚拟机的隔离性,同时也保留了“共享同一个内核”的优势(启动速度快、资源开销小等)。
- RootFs:让容器拥有独立的文件系统视图,与宿主机的根目录区分开来。
- Linux Namespace:
- PID Namespace 让容器内部进程有各自的 PID 视图。
- Network Namespace 让容器拥有独立的虚拟网卡、网络栈。
- Mount Namespace 让容器控制自己的挂载点。
- UTS、IPC、User Namespace 等也实现其他层面的隔离。
- cgroups:
- 对 CPU、内存、IO 等进行资源限制和监控。
- 通过 Docker 参数可很方便地指定容器的资源上限、优先级。
这些机制共同构成了 Docker 容器环境下的核心隔离和限制手段,使得容器能够安全、稳定地在生产环境中运行各种应用。
参考:
0voice · GitHub
相关文章:

深入解析:Docker 容器如何实现文件系统与资源的多维隔离?
目录 一、RootFs1. Docker 镜像与文件系统层2. RootFs 与容器隔离的意义 二、Linux Namespace1. 进程命名空间1.1 lsns 命令说明1.2 查看“祖先进程”命名空间1.3 查看当前用户进程命名空间 2. 容器进程命名空间2.1 查看容器进程命名空间列表2.2 容器进程命名空间的具体体现 三…...
vue项目中打包后的地址加载不出图片【五种解决方案】
在 Vue 项目中打包后,加载图片路径可能会出现问题,主要是因为打包后的路径与开发时的路径不同。为了确保图片可以正确加载,你可以考虑以下几种方法: 1. 使用 require 或 import 动态加载图片 如果你在 Vue 的模板或者脚本中引用…...
讯飞星火大模型将超越chatgpt?
讯飞星火大模型真的能超越ChatGPT吗? 在人工智能的世界里,新技术层出不穷,而科大讯飞最近发布的讯飞星火大模型3.0引发了不少讨论。有些人甚至大胆猜测:这个模型是否能够在某些方面超越如今广受欢迎的ChatGPT?今天,我们就来深入探讨一下这个话题,分析讯飞星火大模型3.0…...
3D Vision--计算点到平面的距离
写在前面 本文内容 计算点到平面的距离 平台/环境 python open3d 转载请注明出处: https://blog.csdn.net/qq_41102371/article/details/121482246 目录 写在前面准备Open3D代码完 准备Open3D pip install open3d代码 import open3d as o3ddef compute_points2…...
《开源与合作:驱动鸿蒙Next系统中人工智能技术创新发展的双引擎》
在当今科技飞速发展的时代,鸿蒙Next系统作为一款具有创新性和前瞻性的操作系统,为人工智能技术的发展提供了广阔的舞台。而开源和合作则是推动鸿蒙Next系统中人工智能技术创新和发展的两大关键引擎。 开源:创新的源泉 代码共享与知识传播&am…...

Java 高级工程师面试高频题:JVM+Redis+ 并发 + 算法 + 框架
前言 在过 2 个月即将进入 3 月了,然而面对今年的大环境而言,跳槽成功的难度比往年高了很多,很明显的感受就是:对于今年的 java 开发朋友跳槽面试,无论一面还是二面,都开始考验一个 Java 程序员的技术功底…...

【机器学习】嘿马机器学习(科学计算库)第11篇:Pandas,学习目标【附代码文档】
本教程的知识点为:机器学习(常用科学计算库的使用)基础定位 机器学习概述 机器学习概述 1.5 机器学习算法分类 1 监督学习 机器学习概述 1.7 Azure机器学习模型搭建实验 Azure平台简介 Matplotlib 3.2 基础绘图功能 — 以折线图为例 1 完善原…...
WordPress Fancy Product Designer插件Sql注入漏洞复现(CVE-2024-51818)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

StarRocks强大的实时数据分析
代码仓库:https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始:StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化…...
Linux(Centos 7.6)命令详解:iconv
1.命令作用 将给定文件的编码从一种编码转换为另一种编码(Convert encoding of given files from one encoding to another) 2.命令语法 Usage: iconv [OPTION...] [FILE...] 3.参数详解 OPTION: 输入/输出格式规范: -f, --from-codeNAME,原始文本编码-t, --t…...

SpringBoot读取配置优先级顺序是什么?
Spring Boot外部化配置详解 目录 引言Spring Boot外部化配置概述配置加载优先级配置加载顺序详解实际案例总结 引言 Spring Boot因其“开箱即用”的特性,极大地简化了Java应用的开发和部署过程。它通过外部化配置机制,允许开发者根据不同的环境&#x…...

VScode连接远程Linux服务器环境配置
一、安装vscode 下载链接:Visual Studio Code - Code Editing. Redefined,点击下载安装即可 安装: 双击安装 选择安装位置,一直点击下一步即可 二、环境配置 1.中文汉化包 2.安装remote-ssh,用于远程连接 2.1安装 2…...
梯度下降法 (Gradient Descent) 算法详解及案例分析
梯度下降法 (Gradient Descent) 算法详解及案例分析 目录 梯度下降法 (Gradient Descent) 算法详解及案例分析1. 引言2. 梯度下降法 (Gradient Descent) 算法原理2.1 基本概念2.2 算法步骤2.3 梯度下降法的变种3. 梯度下降法的优势与局限性3.1 优势3.2 局限性4. 案例分析4.1 案…...

docker 部署 java 项目详解
在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署。今天我们以若依项目为例,总结下部署项目的整体流程。简单来说,第一步:安装项目所需的中间件;第二步࿱…...

npm install 报错:Command failed: git checkout 2.2.0-c
[TOC](npm install 报错:Command failed: git checkout 2.2.0-c) npm install 报错:Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…...

Vue基础(2)
19、组件之间传递数据 组件与组件之间不是完全独立的,而是有交集的,那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件,并传递title属性 --><h3>…...

(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)
城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…...

war包 | Docker部署flowable-ui
文章目录 引言I war包部署flowable-ui下载war包配置Tomcat访问 flowable-uiII Docker启动flowable-ui并修改配置Docker启动flowable-ui修改配置访问Flowable UI界面。III 知识扩展加速源docker run -i -t -d 参数引言 Flowable 支持 BPMN 2.0 行业标准,同时提供了一些 Flowab…...
Java数据结构方面的面试试题以及答案解析
Java数据结构是在计算机中存储和组织数据的方式,用于高效地处理和管理数据。 以下是一些常见的Java数据结构: 数组(Array):一种线性数据结构,允许通过索引快速访问元素。它存储固定大小的相同类型的元素集…...

Qt 5.14.2 学习记录 —— 십구 事件
文章目录 1、事件的概念2、处理事件3、鼠标事件1、鼠标单击和双击2、鼠标移动3、鼠标滚轮滚动 4、键盘事件5、定时器事件6、窗口移动和大小改变事件 1、事件的概念 用户进行操作时会产生事件,事件可以关联处理函数。Qt封装了操作系统的事件机制,然后进一…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...