深入理解Docker和K8S

深入理解Docker和K8S

Docker 是大型架构的必备技能,也是云原生核心。Docker 容器化作为一种轻量级的虚拟化技术,其核心思想:将应用程序及其所有依赖项打包在一起,形成一个可移植的单元。

容器的本质是进程:

容器是在 Linux 宿主机上运行的一个进程,

  • 容器的镜像中定义了容器启动时运行的程序。
  • 在启动时,被设置了新的 NameSpace、IPC、Network、PID、Mount、UTS,所以容器所能看到的进程,网络、磁盘挂载,都与宿主机不同。

通过 Linux 提供的三大核心机制实现:

在这里插入图片描述
1.Namespace:实现资源隔离Namespace是Linux内核提供的资源隔离机制,为容器创建独立的系统资源视图,包括:PID Namespace:隔离进程ID,容器内进程只能看到本容器进程。Network Namespace:隔离网络栈,容器拥有独立的网络接口和IP。Mount Namespace:隔离文件系统挂载点,容器有独立文件系统视图。User Namespace:隔离用户和组ID,提升安全性。IPC、UTS等 Namespace:隔离进程间通信、主机名等资源。通过Namespace,Docker容器实现进程、网络、文件系统等多维度的隔离,保证容器间互不干扰。

2.Cgroups:资源限制与配额Cgroups是Linux内核的资源管理机制,用于限制和监控容器的资源使用,包括CPU、内存、磁盘I/O和网络带宽。它保证容器不会超出分配资源,防止资源争抢和系统过载。Cgroups支持资源优先级管理和统计监控,是Docker实现资源控制的基础。

3.UnionFS:镜像的分层文件系统UnionFS(联合文件系统)允许将多个只读镜像层叠加,形成一个统一的文件系统视图。每个镜像层存储相对于上一层的增量变化,支持镜像层的共享和复用。容器启动时,在镜像层之上添加可写层,实现写时复制(Copy-on-Write),保证镜像层只读且容器的文件变更隔离。

NameSpace 限制了容器能看到的世界:

Linux NameSpace:默认情况下,子进程会复制父进程的 NameSpace。
在这里插入图片描述

Cgroup 限制容器能够使用的资源:

Cgroup 能够对进程使用系统资源进行限制,以 CPU 资源、Memory 资源为例。

CPU资源:

1、限制容器的 CPU 资源使用:cpu.cfs_period_us调度周期(默认为 10000 us)、cpu.cfs_quota_us=-1不限制CPU使用份额、cpu_sharesCPU分配比例(多个容器竞争CPU资源时使用)。
在这里插入图片描述
2、容器运行后,会创建对应的/sys/fs/cgroup/cpu/docker/<CONTAINER ID>目录,用于 CPU 资源的控制组(cgroups)管理。以下是各个文件和目录的作用解释:
在这里插入图片描述

  • cgroup.clone_children: 这个文件影响 clone() 系统调用,用于控制是否在创建新进程时复制父进程的 CPU 控制组设置。
  • cgroup.procs: 包含当前 cgroup 中的所有进程 ID (PID)。这个文件可读可写,写入一个 PID 可以将该进程移动到这个 cgroup 中。
  • cpuacct.stat: 报告这个 cgroup 中所有进程的 CPU 使用情况,包括用户态和内核态的使用时间。
  • cpuacct.usage: 报告这个 cgroup 中所有进程的总 CPU 使用时间,以纳秒为单位。
  • cpuacct.usage_all: 显示每个 CPU 的使用情况,包括用户态和内核态的使用时间。
  • cpuacct.usage_percpu: 显示每个 CPU 核心的使用时间。
  • cpuacct.usage_percpu_sys: 显示每个 CPU 核心的内核态使用时间。
  • cpuacct.usage_percpu_user: 显示每个 CPU 核心的用户态使用时间。
  • cpuacct.usage_sys: 报告这个 cgroup 中所有进程在内核态下的 CPU 使用时间。
  • cpuacct.usage_user: 报告这个 cgroup 中所有进程在用户态下的 CPU 使用时间。
  • cpu.cfs_period_us: 配合 cpu.cfs_quota_us 使用,定义 CPU 带宽控制的时间周期,以微秒为单位。
  • cpu.cfs_quota_us: 定义 cgroup 在 cpu.cfs_period_us 周期内可以使用的 CPU 时间总量,以微秒为单位。通过设置这个值,可以限制 cgroup 的 CPU 使用带宽。
  • cpu.shares: 定义 cgroup 的 CPU 分享数。值越高,cgroup 在竞争 CPU 资源时获得的优先级越高。
  • cpu.stat: 提供一些 CPU 限制的统计信息,比如用户态和系统态下的等待时间。
  • notify_on_release: 控制当 cgroup 的最后一个进程结束时,是否自动删除该 cgroup。设置为 1 表示启用通知,设置为 0 表示禁用。
  • tasks: 包含当前 cgroup 中的所有线程 ID (TID)。与 cgroup.procs 类似,但包含线程而不是进程。
Memory资源:

1、限制容器的 Memory 资源使用:memory.limit_in_bytes限制容器可以使用的物理内存的上限、memory.oom_control容器超过内存上限的策略(默认为kill)
在这里插入图片描述
2、容器运行后,会创建对应的/sys/fs/cgroup/memory/docker/<CONTAINER ID>目录,用于 Memory 资源的控制组(cgroups)管理。以下是各个文件和目录的作用解释:
在这里插入图片描述

  • cgroup.clone_children: 影响 clone() 系统调用,用于控制是否在创建新进程时复制父进程的内存控制组设置。
  • cgroup.event_control: 用于事件控制,当某些条件满足时,可以触发用户空间的事件通知。
  • cgroup.procs: 包含当前 cgroup 中的所有进程 ID (PID)。这个文件可读可写,写入一个 PID 可以将该进程移动到这个 cgroup 中。
  • memory.failcnt: 记录内存资源分配失败的次数。
  • memory.force_empty: 触发内存 cgroup 的强制清空。
  • memory.kmem.failcnt: 记录内核内存分配失败的次数。
  • memory.kmem.limit_in_bytes: 设置内核内存的使用限制,以字节为单位。
  • memory.kmem.max_usage_in_bytes: 记录内核内存的最大使用量,以字节为单位。
  • memory.kmem.slabinfo: 显示内核 slab 分配器的内存使用信息。
  • memory.kmem.tcp.failcnt: 记录 TCP 缓冲相关的内核内存分配失败的次数。
  • memory.kmem.tcp.limit_in_bytes: 设置 TCP 缓冲相关的内核内存的使用限制,以字节为单位。
  • memory.kmem.tcp.max_usage_in_bytes: 记录 TCP 缓冲相关的内核内存的最大使用量,以字节为单位。
  • memory.kmem.tcp.usage_in_bytes: 显示当前 TCP 缓冲相关的内核内存使用量,以字节为单位。
  • memory.kmem.usage_in_bytes: 显示当前内核内存使用量,以字节为单位。
  • memory.limit_in_bytes: 设置 cgroup 的内存使用限制,以字节为单位。
  • memory.max_usage_in_bytes: 记录 cgroup 的最大内存使用量,以字节为单位。
  • memory.move_charge_at_immigrate: 控制当进程移动到其他 cgroup 时,是否移动其内存使用量。
  • memory.numa_stat: 显示 NUMA 节点相关的内存使用统计信息。
  • memory.oom_control: 控制内存不足时的行为。
    一旦容器内的进程占用内存超过限制,则可通过设置该字段让进程kill。
  • memory.pressure_level: 用于监控内存压力水平,可以设置触发事件通知的阈值。
  • memory.soft_limit_in_bytes: 设置内存的软限制,以字节为单位。超过软限制不会直接导致 OOM,但系统会尝试回收内存。
  • memory.stat: 包含各种内存使用统计信息,如当前使用量、RSS、缓存等。
  • memory.swappiness: 控制 cgroup 的交换倾向程度,值范围为 0-100。
  • memory.usage_in_bytes: 显示当前内存使用量,以字节为单位。
  • memory.use_hierarchy: 控制是否在计算内存使用时考虑子 cgroup。
  • notify_on_release: 控制当 cgroup 的最后一个进程结束时,是否自动删除该 cgroup。设置为 1 表示启用通知,设置为 0 表示禁用。
  • tasks: 包含当前 cgroup 中的所有线程 ID (TID)。与 cgroup.procs 类似,但包含线程而不是进程。

Overlay2文件系统:

overlay2 是一种堆叠文件系统,基于 Linux 内核的 OverlayFS 技术,依赖并建立在其他文件系统上,并不参与磁盘空间结构的划分,仅是将底层文件系统中的不同目录结构进行“合并”,然后向用户呈现。

在这里插入图片描述

  • 上层会覆盖下层相同的内容,故用户只能看到和操作 Merge 层,操作的变化会记录在 Upper 层,Lower 层是只读的
  • 用户创建新文件,则upper层会直接创建;删除文件,则在upper层创建一个“屏蔽”文件,屏蔽(whiteout)掉lower层的同名文件;修改文件内容,执行copy-on-write将lower层文件拷贝到upper层,保留原文件名只在upper层修改文件内容,并屏蔽(whiteout)掉lower层;修改文件名,执行copy-on-write将lower层文件拷贝到upper层,使用新文件名,并在upper层创建一个与原名相同的“屏蔽”文件用来屏蔽(whiteout)掉lower层。

Overlay2 是 Docker 默认使用的联合文件系统 UFS(Union Filesystem),用于管理容器镜像的分层存储和容器运行时文件系统的合并。

在这里插入图片描述

Overlay2 是 Docker 的分层存储引擎,通过联合挂载实现高效的文件管理。Docker 的 Overlay2 数据默认存储在 /var/lib/docker/overlay2/(通过docker inspect <container-ID>中的GraphDriver字段,查看对应层数据的存储位置)。当启动容器时,

  • 镜像层(Lower Dir):所有镜像层按顺序堆叠(如 base-image → apt-get install → copy files)。
  • init层:会将宿主机的一些host相关的文件/目录拷贝到对应的docker层的文件/目录下,之后这些文件会被挂载给容器。
  • 容器层(Upper Dir):镜像层之上创建的一个可写层,存储容器运行时的修改。
  • 合并视图(Merged):将只读层和可写层合并,形成容器的完整文件系统。

在这里插入图片描述
注意:docker commit时,只会保存 upper 层,不会保存 init 层。
在这里插入图片描述

Overlay2 的优点:

  • 高效分层存储:多个容器共享相同的基础镜像层,节省空间。
  • 写时复制(CoW):只有修改文件时才复制,减少磁盘 I/O。
  • 性能较好:相比 aufs 和 devicemapper,Overlay2 是 Docker 推荐的存储驱动。

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

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

相关文章

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 讲解一下语法

这段代码使用了Java中的forEach方法结合Lambda表达式来遍历一个列表&#xff0c;并对列表中的每个元素执行特定操作。具体来说&#xff0c;它会遍历列表中的每一个元素&#xff0c;并调用countService.refreshArticleStatisticInfo(s.getId())方法来刷新每个文章的统计信息。下…

AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)

目录 背景一、AI工业化时代的算力困局与破局之道1.1 中小企业AI落地的三大障碍1.2 GpuGeek的破局创新1.3 核心价值 二、GpuGeek技术全景剖析2.1 核心架构设计 三、核心优势详解‌3.1 优势1&#xff1a;工业级显卡舰队‌‌‌3.2 优势2&#xff1a;开箱即用生态‌3.2.1 预置镜像库…

05算法学习_59. 螺旋矩阵 II

05算法学习_59. 螺旋矩阵 II 05算法学习_59. 螺旋矩阵 II题目描述&#xff1a;个人代码&#xff1a;学习思路&#xff1a;第一种写法&#xff1a;题解关键点&#xff1a; 个人学习时疑惑点解答&#xff1a; 05算法学习_59. 螺旋矩阵 II 力扣题目链接: 59. 螺旋矩阵 II 题目描…

JDK7Hashmap的头插法造成的环问题

单线程下的扩容 多线程下的扩容 next&#xff1d;e 然后e的next变成e

JAVA|后端编码规范

目录 零、引言 一、基础 二、集合 三、并发 四、日志 五、安全 零、引言 规范等级&#xff1a; 【强制】&#xff1a;强制遵守&#xff0c;来源于线上历史故障&#xff0c;将通过工具进行检查。【推荐】&#xff1a;推荐遵守&#xff0c;来源于日常代码审查、开发人员反馈…

2025-05-21 Python深度学习5——数据读取

文章目录 1 数据准备2 Dataset2.1 自定义 Dataset2.2 使用示例 3 TensorBoard3.1 安装3.2 标量可视化&#xff08;Scalars&#xff09;3.3 图像可视化&#xff08;Images&#xff09;3.4 其他常用功能 4 transform4.1 ToTensor()4.2 Normalize()4.3 Resize()4.4 Compose()4.5 C…

5月21日学习笔记

MYSQL三层结构 表1 数据库DB1 表2 数据库管理系统 客户端命令终端&#xff08;Dos&#xff09; DBMS 数据库DB2 表1 表2 数据库………. Mysql数据库-表的本质仍然是文件 表的一行称之为一条记录->在java程序中一行记录往往使用对象表示 SQL语…

二十、面向对象底层逻辑-ServiceRegistry接口设计集成注册中心

一、服务治理的基石接口 在微服务架构中&#xff0c;服务实例的动态注册与发现是保证系统弹性的关键机制。Spring Cloud Commons模块通过ServiceRegistry与Registration接口定义了服务注册的标准化模型&#xff0c;为不同服务发现组件&#xff08;Eureka、Consul、Nacos等&…

DeepSeek:以开源之力,引领AI技术新风潮

在年春节&#xff0c;大语言模型DeepSeek如同一枚震撼弹&#xff0c;在全球范围内引发了轰动&#xff0c;成功“破圈”&#xff0c;将中国的人工智能&#xff08;AI&#xff09;技术成果推向了世界舞台。 开源策略&#xff1a;打破技术壁垒 在AI行业&#xff0c;OpenAI等巨头…

完整改进RIME算法,基于修正多项式微分学习算子Rime-ice增长优化器,完整MATLAB代码获取

1 简介 为了有效地利用雾状冰生长的物理现象&#xff0c;最近开发了一种优化算法——雾状优化算法&#xff08;RIME&#xff09;。它模拟硬雾状和软雾状过程&#xff0c;构建硬雾状穿刺和软雾状搜索机制。在本研究中&#xff0c;引入了一种增强版本&#xff0c;称为修改的RIME…

PyTorch可视化工具——使用Visdom进行深度学习可视化

文章目录 前置环境Visdom安装并启动VisdomVisdom图形APIVisdom静态更新API详解通用参数说明使用示例Visdom动态更新API详解1. 使用updateappend参数2. ~~使用vis.updateTrace方法~~3. 完整训练监控示例 Visdom可视化操作散点图plot.scatter()散点图案例线性图vis.line()vis.lin…

Java使用Collections集合工具类

1、Collections 集合工具类 Java 中的 Collections 是一个非常有用的工具类&#xff0c;它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中&#xff0c;主要包含对集合进行操作的方法&#xff0c;比如排序、搜索、线程安全化等。 Java集合工具类的使用&#x…

Unity基础学习(五)Mono中的重要内容(1)延时函数

目录 一、Mono中的延时函数Invoke 1. Invoke作用&#xff1a;延迟指定时间后执行一次函数。API&#xff1a; 2. InvokeRepeating作用&#xff1a;延迟后开始重复执行函数。API&#xff1a; 3. CancelInvoke作用&#xff1a;停止所有延时函数&#xff0c;或停止指定函数的延时…

180KHz 60V 5A开关电流升压/升降压型DC-DC转换器XL4019升降压芯片

介绍 XL6019是一款专为升压、升降压设计的 单片集成电路&#xff08;升压和降压是由外围电路拓扑确定的&#xff09;&#xff0c;可工作在DC5V到40V输入电 压范围&#xff0c;低纹波&#xff0c;内置功率MOS。XL6019内 置固定频率振荡器与频率补偿电路&#xff0c;简化了电 路…

如何畅通需求收集渠道,获取用户反馈?

要畅通需求收集渠道、有效获取用户反馈&#xff0c;核心在于多样化反馈入口、闭环反馈机制、用户分层管理、反馈数据结构化分析等四个方面。其中&#xff0c;多样化反馈入口至关重要&#xff0c;不同用户有不同的沟通偏好&#xff0c;只有覆盖多个反馈路径&#xff0c;才能捕捉…

Python结合ollama和stramlit开发聊天机器人

Python结合ollama和stramlit开发聊天机器人 一、环境准备1、streamlit安装2、langchain安装3、ollama的安装 二、Ollama平台聊天机器人实现1、需求2、模型调用3、前端实现页面呈现代码实现 三、详细代码地址四、参考资源 一、环境准备 1、streamlit安装 # 通过 pip 安装 pip …

java jdbc执行Oracle sql文件

执行代码 import java.io.FileInputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.DriverManager;import org.apache.ibatis.jdbc.ScriptRunner;public class ExecSqlFileController {pu…

[Java实战]Spring Boot整合MinIO:分布式文件存储与管理实战(三十)

[Java实战]Spring Boot整合MinIO&#xff1a;分布式文件存储与管理实战&#xff08;三十&#xff09; 一、MinIO简介与核心原理 MinIO 是一款高性能、开源的分布式对象存储系统&#xff0c;兼容 Amazon S3 API&#xff0c;适用于存储图片、视频、日志等非结构化数据。其核心特…

开发指南115-CSS中选择器关系

1、选择后代 可以用选择器1 选择器2&#xff08;中间用空格分隔&#xff09;来表达&#xff0c;也可以在大括号里通过包含关系来表达 举例 .a .b 举例.a { .b{} } 注意css本身并不支持嵌套的写法&#xff0c;是scss等提供的扩展能力。 2、选择直系后代 选择器1 > 选择器2&a…

创建型:抽象工厂模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 1、核心思想 目的&#xff1a;统一管理相关对象的创建&#xff0c;确保产品兼容性。优先用于需要强约束产品兼容性的场景&#xff08;如UI主题、跨平台适配&#xff09; 概念&#…