深入理解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.mzph.cn/web/80918.shtml

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

相关文章

docker中使用openresty

1.为什么要使用openresty 我这边是因为要使用1Panel&#xff0c;第一个最大的原因&#xff0c;就是图方便&#xff0c;比较可以一键安装。但以前一直都是直接安装nginx。所以需要一个过度。 2.如何查看openResty使用了nginx哪个版本 /usr/local/openresty/nginx/sbin/nginx …

CSS【详解】弹性布局 flex

适用场景 一维&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素为容器 所有被布局的元素为项目 项目的排列方向&#xff08;垂直/水平&#xff09;为主轴 与主轴垂直的方向交交叉轴 容器上启用 flex 布局 将容器的 display 样式设置为 flex 或 i…

全能视频处理工具介绍说明

软件介绍 本文介绍的软件是FFmpeg小白助手&#xff0c;它是一款视频处理工具。 使用便捷性 这款FFmpeg小白助手无需安装&#xff0c;解压出来就能够直接投入使用。 主要功能概述 该工具主要具备格式转换、文件裁剪、文件压缩、文件合并这四大功能。 格式转换能力 软件支持…

Linux中的DNS的安装与配置

DNS简介 DNS&#xff08;DomainNameSystem&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS使用的是53端口 通常DNS是以UDP这个较快速的数据传输协议来查询的&#xff0c;但是没有查…

tshark的使用技巧(wireshark的命令行,类似tcpdump):转换格式,设置filter

tshark的使用技巧&#xff08;wireshark的命令行&#xff0c;类似tcpdump&#xff09;&#xff1a;转换格式&#xff0c;设置filter tshark一般在 C:\Program Files\Wireshark 使用管理员权限 打开cmd tshark -D 列出支持抓包的接口&#xff1a; c:\Program Files\Wiresh…

vscode打开的文件被覆盖/只能打开两个文件(Visual Studio Code)

vscode打开的文件被覆盖/只能打开两个文件&#xff08;Visual Studio Code&#xff09; 单击代码文件&#xff1a;是预览模式&#xff0c;只会显示有限的一两个文件&#xff0c;在一个tab里更新显示 双击代码文件&#xff1a;是编辑模式&#xff0c;可以同时显示多个代码文件…

唯创安全优化纸业车间安全环境:门口盲区预警报警器的应用与成效

一、客户现场 客户主要从事于卷烟纸、成型纸、烟草制造业用纸及其他特定用途纸类制品的加工、生产与销售。在其厂区内&#xff0c;叉车频繁作业&#xff0c;车间环境复杂。经实地查看&#xff0c;发现几大安全隐患&#xff1a; 门口拐角隐患&#xff1a;门口拐角处因卷帘门阻…

Debezium快照事件监听器系统设计

Debezium快照事件监听器系统设计 1. 系统概述 1.1 设计目标 为 Debezium 的快照过程提供可扩展的事件监听机制允许外部系统在快照过程中执行自定义逻辑提供线程安全的事件分发机制确保监听器的异常不会影响主快照流程1.2 核心功能 表快照开始事件监听表快照完成事件监听行数据…

Ubuntu 20.04安装及配置docker

在安装docker的过程中主要参考博客&#xff1a;ubuntu20.04 安装docker (详细版) 但是在测试&#xff1a; sudo docker run hello-world 时报错&#xff1a; docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request ca…

第23天-Python Flet 开发指南

环境准备 pip install flet 示例1:基础计数器应用 import flet as ftdef main(page: ft.Page):page.title = "计数器"page.vertical_alignment = ft.MainAxisAlignment.CENTERtxt_number = ft.TextField(value="0", text_align=ft.TextAlign.RIGHT, wid…

牛客网NC21989:牛牛学取余

牛客网NC21989:牛牛学取余 &#x1f4dd; 题目描述 ⏱️ 限制条件 时间限制&#xff1a;C/C/Rust/Pascal 1秒&#xff0c;其他语言2秒空间限制&#xff1a;C/C/Rust/Pascal 32 M&#xff0c;其他语言64 M输入范围&#xff1a;两个整数&#xff0c;在int范围内 &#x1f4e5;…

unity XCharts插件生成曲线图在UICanvas中

【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用_unity xcharts-CSDN博客

自动驾驶传感器数据处理:Python 如何让无人车更智能?

自动驾驶传感器数据处理:Python 如何让无人车更智能? 1. 引言:为什么自动驾驶离不开数据处理? 自动驾驶一直被誉为人工智能最具挑战性的应用之一,而其背后的核心技术正是 多传感器融合与数据处理。 一辆智能驾驶汽车,通常搭载: 激光雷达(LiDAR) —— 3D 环境感知,…

MCU 上电不启动的常见原因分析与排查思路

在开发过程中&#xff0c;“MCU 上电不运行”是我们经常遇到的问题之一。但客户对此类问题的描述往往较为模糊&#xff0c;仅简单表示“产品不工作”或“怀疑 MCU 没有运行”&#xff0c;这给我们现场排查带来了较大的挑战。即便工程师到达现场&#xff0c;往往也无法迅速定位问…

React中使用 Ant Design Charts 图表

// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App&#xff0c;用于展示柱状图 function App() {// 数据源&#xff1a;每个对象代表一个柱子&#xff0c;包含类型&#xff08;type&#xff09;和销售额&#xff0…

30、WebAssembly:古代魔法——React 19 性能优化

一、符文编译术&#xff08;编译优化&#xff09; 1. 语言选择与量子精简 // Rust编译优化 cargo build --target wasm32-wasi --release 魔法特性&#xff1a; • 选择低运行时开销语言&#xff08;如Rust/C&#xff09;&#xff0c;编译后文件比Swift小4倍 • --rel…

初识计算机网络。计算机网络基本概念,分类,性能指标

初识计算机网络。计算机网络基本概念&#xff0c;分类&#xff0c;性能指标 本系列博客源自作者在大二期末复习计算机网络时所记录笔记&#xff0c;看的视频资料是B站湖科大教书匠的计算机网络微课堂&#xff0c;祝愿大家期末都能考一个好成绩&#xff01; 视频链接地址 一、…

深入理解 MongoDB 的 _id 和 ObjectId:从原理到实践

在 MongoDB 的世界中&#xff0c;_id 字段和 ObjectId 是每个开发者都必须理解的核心概念。作为 MongoDB 文档的唯一标识符&#xff0c;它们不仅影响着数据库的设计&#xff0c;也直接关系到应用的性能和扩展性。本文将全面剖析 _id 和 ObjectId 的工作原理、实际应用场景以及最…

计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据

以下是一个结合ARIMA、鲸鱼优化算法(WOA)、CNN和LSTM进行时间序列预测的Python实现框架。由于完整代码和数据量较大,此处提供核心代码结构和示例数据集,您可根据需求扩展。 1. 数据准备(示例数据) 使用airline-passengers.csv(航空乘客数据集): import pandas as pd…

【project】--基于大数据离线数仓技术检测网站流量

文章目录 项目介绍项目指标1)页面浏览量&#xff08;PV&#xff09;&#xff1a;2)独立访客数&#xff08;UV&#xff09;&#xff1a;3)每小时环比增长&#xff1a;4)每小时同比增长&#xff1a;5)跳出率&#xff08;Bounce Rate&#xff09;&#xff1a; 环境搭建 项目介绍 …