一. 引言: 

  大家都知道,在一台机器上,可以运行任意(根据系统资源)个容器实例。且各容器间是相互独立,不做任何关联的。那么,docker是通过什么方式来实现容器隔离的呢? 接下来我们了解下。

二. 关于容器隔离机制:

   容器的隔离机制是实现 “轻量级虚拟化” 的核心,通过Linux 内核原生技术与容器运行时(如 docker、containerd)的封装,在共享宿主机内核的同时,为每个容器提供独立的资源、网络、文件系统等环境,避免容器间相互干扰。其本质是 “在同一内核中为进程组划定资源与权限边界”,而非像虚拟机那样完全隔离操作系统。

   主要分为一下三个大方向: 

Namespace  可实现容器间的隔离
Cgroups    可限制容器的资源使用
Chroot     文件系统的隔离(挂载到物理根目录(文件系统)下的子目录(虚拟文件系统))

 1. 关于namespace:

    Linux 内核从版本 2.4.19 开始陆续引入了 namespace 的概念。其目的是将某个特定的全局系统资源(global system resource)通过抽象方法使得namespace 中的进程看起来拥有它们自己的隔离的全局系统资源实例。Linux 内核中实现了六种 namespace,按照引入的先后顺序,列表如下:

namespace

引入的相关内核版本被隔离的全局系统资源在容器语境下的隔离效果
Mount Linux 2.4.19文件系统挂接点每个容器能看到不同的文件系统层次结构
šUTS Linux 2.6.19主机名和域名每个容器可以有自己的 hostname 和 domainame
IPC Linux 2.6.19

System V IPC:消息队列,信号量,共享内存

每个容器有其自己的 System V IPC 和消息队列文件系统,因此,只有在同一个 IPC namespace 的进程之间才能互相通信
PID Linux 2.6.24进程 ID(编号) 每个 PID namespace 中的进程可以有其独立的 PID; 每个容器可以有其 PID 为 1 的root 进程;也使得容器可以在不同的 host 之间迁移,因为 namespace 中的进程 ID 和 host 无关了。这也使得容器中的每个进程有两个PID:容器中的 PID 和 host 上的 PID。
Network 始于Linux 2.6.24 完成于 Linux 2.6.29网络相关的系统资源每个容器用有其独立的网络设备,IP 地址,IP 路由表,/proc/net 目录,端口号等等。这也使得一个 host 上多个容器内的同一个应用都绑定到各自容器的 80 端口上。
User 始于 Linux 2.6.23 完成于 Linux 3.8)用户和组 ID 空间 在 user namespace 中的进程的用户和组 ID 可以和在 host 上不同; 每个 container 可以有不同的 user 和 group id;一个 host 上的非特权用户可以成为 user namespace 中的特权用户;
 

Linux内核实现namespace的主要目的就是为了实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身于一个独立的系统环境中,以此达到独立和隔离的目的。

2. Cgroups:

   容器通过namespace机制实现了环境上的隔离。但只有运行环境隔离还不够,因为这些进程还是可以不受限制地使用系统资源,比如网络、磁盘、CPU以及内存 等。一方面,是为了防止它占用了太多的资源而影响到其它进程;另一方面,在系统资源耗尽的时候,linux 内核会触发 OOM,这会让一些被杀掉的进程成了无辜的替死鬼。因此,为了让容器中的进程更加可控,Docker 使用 Linux cgroups 来限制容器中的进程允许使用的系统资源。 

 Linux Cgroup 可为系统中所运行任务(进程)的用户定义组群分配资源 — 比如 CPU 时间、系统内存、网络带宽或者这些资源的组合。可以监控您配置的 cgroup,拒绝 cgroup 访问某些资源,甚至在运行的系统中动态配置您的 cgroup。它以一组进程为目标进行系统资源分配和控制。

它主要提供了以下功能:

Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
Accounting: 资源统计,一些审计或一些统计,主要目的是为了计费。
Control: 进程控制,挂起进程,恢复执行进程。
使用 cgroup,系统管理员可更具体地控制对系统资源的分配、优先顺序、拒绝、管理和监控。可更好地根据任务和用户分配硬件资源,提高总体效率。在实际中,系统管理员一般会利用CGroup做下面这些事:
隔离一个进程集合(比如:nginx的所有进程),并限制他们所消费的资源,比如绑定CPU的核。
为这组进程分配其足够使用的内存
为这组进程分配相应的网络带宽和磁盘存储限制
限制访问某些设备(通过设置设备的白名单)

  3. Chroot: 

    是容器的 “独立文件系统根目录”,通过分层挂载(UnionFS) 实现,核心作用是:

1. 隔离性:容器内的/目录与宿主机完全独立,修改容器内文件(如/etc/passwd)不会影响宿主机。
2. 轻量性:采用 “基础镜像层 + 容器层” 的分层结构,多个容器可共享基础镜像层。
3. 一致性:每个容器启动时都基于相同的基础镜像,确保运行环境一致(避免 “本地能跑,线上跑不了”)。

  关键技术: UnionFS(联合文件系统)

  常用的 UnionFS 实现包括overlay2(Docker 默认)、aufs、btrfs等,以overlay2为例,其分层结构如下:

lowerdir:基础镜像层(可多层,如 “操作系统层 + Nginx 层”),仅可读;
upperdir:容器层,容器运行时的所有写操作(如创建 / 修改文件)都在这一层;
merged:容器内看到的 “根目录”,是lowerdir和upperdir的联合挂载结果;
workdir:临时工作目录,用于 UnionFS 的内部操作(用户不可见)。

三. 容器隔离 vs 虚拟机隔离: 

对比维度容器虚拟机
隔离核心共享宿主机内核,通过 namespace/cgroup 隔离进程完全隔离操作系统(含内核),通过 hypervisor 虚拟化硬件
资源开销轻量(MB 级内存,秒级启动),共享宿主机资源重量级(GB 级内存,分钟级启动),每个 vm 需独立分配资源
安全性较弱(共享内核,存在 “内核漏洞突破隔离” 风险)较强(完全隔离内核,VM 内攻击难以影响宿主机)
兼容性依赖宿主机内核版本(如容器内无法运行与宿主机内核不兼容的程序)兼容性强(VM 内可运行任意操作系统,与宿主机内核无关)

四. 无法隔离的资源: 

  1. 内核版本:容器内的内核版本与宿主机完全一致,无法在容器内升级内核;
  2. 内核模块:容器无法加载 / 卸载宿主机内核模块(需宿主机提前加载);
  3. 系统时间:默认情况下,容器内修改系统时间会同步修改宿主机时间。
  4. 硬件资源:部分硬件资源(如 CPU 缓存、NUMA 节点)无法精细隔离,可能存在 “缓存侧信道攻击” 风险;
  5. 内核漏洞:若宿主机内核存在漏洞(如 Dirty COW),容器内的恶意进程可能利用漏洞突破隔离,获取宿主机权限。

-  --------------------------------------------------------------------------------------------------------------------------

                         深耕运维行业多年,擅长运维体系建设,方案落地。欢迎交流!

                                                     “V-x”: ywjw996

                                                     《 运维经纬 》


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96216.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96216.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96216.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Agentic RL Survey: 从被动生成到自主决策

Agentic RL Survey: 从被动生成到自主决策 本文将系统解读《The Landscape of Agentic Reinforcement Learning for LLMs: A Survey》这篇综述。该综述首次将智能体强化学习(Agentic RL)与传统LLM-RL范式正式区分,通过MDP/POMDP理论框架梳理…

彻底禁用 CentOS 7.9 中 vi/vim 的滴滴声

在 VMware 虚拟机中安装的 CentOS 7.9 系统,即使通过修改 /etc/inputrc 禁用了终端铃声(set bell-style none),vi 或 vim 编辑时仍可能发出滴滴声。这是因为 vi/vim 有自己独立的铃声控制机制。以下是解决方法:方法 1&…

基于A2A和ADK的内容规划代理

项目概述 Content Planner Agent 是一个基于 Google Agent Development Kit (ADK) 和 Python A2A SDK 构建的智能内容规划代理。该代理能够根据高层次的内容描述,创建详细的内容大纲。 什么是A2A Protocol A2A Protocol(Agent2Agent 协议)…

Linux-条件变量

文章目录条件变量概述条件变量的优缺点条件变量相关函数pthread_cond_init函数pthread_cond_destroy函数pthread_cond_wait函数pthread_cond_signal函数测试生产者和消费者模型条件变量 概述 与互斥锁不同,条件变量是用来等待而不是用来上锁的,条件变量…

[硬件电路-166]:Multisim - SPICE与Verilog语言的区别

SPICE与Verilog语言在电子设计领域中扮演不同角色,SPICE是电路仿真语言,用于精确模拟电路行为;Verilog是硬件描述语言,用于描述数字电路的结构和行为。以下是两者的详细区别:一、核心定位与用途SPICE:电路仿…

玩转Docker | 使用Docker部署Umbrel操作系统

玩转Docker | 使用Docker部署Umbrel操作系统 前言 一、 Umbrel 介绍 Umbrel简介 Umbrel主要特点 二、系统要求 环境要求 环境检查 Docker版本检查 检查操作系统版本 三、部署Umbrel服务 下载Umbrel镜像 编辑部署文件 创建容器 检查容器状态 检查服务端口 安全设置 四、访问Umbr…

Flink Task线程处理模型:Mailbox

Task的线程 和 MailboxProcessor 的绑定executingThread 是 Task 类(StreamTask 的父类)在构造时创建的物理线程。MailboxProcessor 是 StreamTask 用来处理异步事件和驱动其主要处理逻辑(processInput)的核心组件。它们之间的绑定…

OpenCV 银行卡号识别

目录 一、项目原理与核心技术 二、环境准备与工具包导入 1. 环境依赖 2. 工具包导入 三、自定义工具类 myutils.py 实现 四、主程序核心流程(银行卡识别.py) 1. 命令行参数设置 2. 银行卡类型映射 3. 辅助函数:图像展示 五、步骤 1…

计算机二级Python

一.静态语言和脚本语言高级语言根据计算机执行机制的不同分为两类:静态语言和脚本语言静态语言的核心特征:变量的类型在编译时(写代码时)就必须确定并固定下来,即在使用一个变量前必须显式地声明它地类型一旦声明&…

Mybatis Log Plugin打印日志,会导致CPU升高卡死

原因 大量日志输出:MyBatis Log Plugin 会打印大量的 SQL 日志,包括 SQL 语句及其参数。如果项目中 SQL 查询频繁且复杂,日志量会非常大,导致 CPU 使用率升高,甚至卡死。 日志级别设置不当:如果将日志级别设置为 DEBUG 或 TRACE,MyBatis 会输出非常详细的日志信息,这会…

鸿蒙:深色模式适配和浅色模式的切换

前言: 有些时候我们需要对应用进行深色模式的适配处理,并且在不需要的时候切换到浅色状态,下面和大家一起照着官方文档来学习。 下面是官方文档的链接: https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-dark-…

Coze源码分析-资源库-删除插件-后端源码-数据访问和基础设施层

5. 数据访问层 5.1 仓储接口定义 插件仓储接口 文件位置:backend/domain/plugin/repository/plugin.go type PluginRepository interface {// DeleteDraftPlugin 删除插件草稿DeleteDraftPlugin(ctx context.Context, pluginID int64) error// DeleteAPPAllPlugins …

案例一: 对基础选择器的使用【网页盒子】

【1】样例&#xff1a;首先&#xff0c;观察到&#xff0c;几个元素竖着排列的&#xff0c;所以使用块级元素&#xff0c;而不是行内元素。【2】代码演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…

爬虫项目优化:如何用 Redis 实现 “断点续爬”?避免重复采集电商数据

在电商数据采集场景中&#xff0c;爬虫常因网络波动、服务器重启、IP 封禁等问题中断。若缺乏断点续爬机制&#xff0c;重启后需从头开始&#xff0c;不仅浪费带宽与时间&#xff0c;还可能因重复采集导致数据冗余。Redis 凭借其高性能、原子操作、多样数据结构的特性&#xff…

决策树概念与原理

决策树简介决策树是一种树形结构树中每个内部节点表示一个特征上的判断&#xff0c;每个分支代表一个判断结果的输出&#xff0c;每个叶子节点代表一种分类结果(仅举例无其他意义或隐喻)就像一个女孩去相亲&#xff0c;那么首先询问是否大于30&#xff0c;大于则不见&#xff0…

SQL面试题及详细答案150道(116-135) --- 高级查询与函数篇

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,MySQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 116. 如何使用CASE语句实…

VeRL:强化学习与大模型训练的高效融合框架

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 概述&#xff1a;VeRL的起源与核心价值 VeRL&#xff08;Versatile…

2. 计算机系统基础知识

1 计算机系统概述 计算机系统 (Computer System) 是指用于数据管理的计算机硬件、软件及网络组成的系统。 计算机系统可划分为硬件(子系统)和软件(子系统)两部分。硬件由机械、电子元器件、磁介质和光介质等物理实体构成&#xff0c;例如处理器(含运算单元和控制单元)、存储器、…

国产EtherCAT从站芯片FCE1353与N32G435 MCU功能板测试流程

上期推荐&#xff0c;我们在前期介绍了FCE1353与国民N32G435 MCU开发板的基本情况&#xff0c;本期主要介绍此开发板的测试流程&#xff0c;以便用户拿到此板做功能验证、兼容性测试、可靠性测试时更加便捷地提高开发验证效率。01概述FCE1353_N32G435RBL7_GPIO_V1 开发板主要通…

向日葵亮点16功能解析:被控端“快速解锁”

向日葵16重磅上线&#xff0c;本次更新新增了诸多实用功能&#xff0c;提升远控效率&#xff0c;实现应用融合突破设备边界&#xff0c;同时全面提升远控性能&#xff0c;操作更顺滑、画质更清晰&#xff01;无论远程办公、设计、IT运维、开发还是游戏娱乐&#xff0c;向日葵16…