Docker原理详细剖析-Namespace
一、简介
docker容器技术从2013年开始火了以后,2014年左右当时有幸在学校能和学院教授一起做些项目以及学习。其中docker技术在当时来说还算是比较新的技术,国内关于这块的资料以及使用也才刚刚开始,讨论docker技术,算是相对时髦的话题。 现在回头望去,已经10年有余,很佩服当时带领我们学习新技术的教授导师,看到这个技术的前景,所以接触的相对早,对后面我的工作起到了相当大的帮助。当时我还写了一篇关于如何通俗理解docker的博客文章,也得到了大多数朋友的支持和点赞~。 附上原文地址,入门的同学可以看下。
原文链接: docker通俗理解
Docker并没有创造了什么新的技术,所有用到的技术都是已经存在的, docker将这些技术进行了很好地组合与融汇, 降低了开发者使用容器技术的门槛。 核心来讲, Docker使用了:
1、Linux 提供的namespace隔离技术(解决了进程"视野隔离"问题, 进程之间互不影响,达到隔离的目的)
2、Linux提供的cgroups资源限制技术(可以针对进程进行资源限制)
还未入门和使用过Docker的同学建议熟练使用docker后再回头看这篇文章,要不然效果适得其反~
本章针对namespace做个剖析, 看下背后实现的基本原理。
二、Namespace隔离技术
1、为什么需要Namespace隔离技术?
Docker本质上是一种虚拟化技术,属于进程级别的虚拟化。 既然是进程级别的虚拟化,那就是运行在不同容器的进程,彼此之间资源以及"视野"(进程所处上下文环境)是不同的。 例如我在A容器运行一个p1进程, 同时在B容器运行一个p2进程, 此时分别在A和B容器运行 ps aux, 看到的内容是不一样的。
如果没有namespace技术做隔离,那么我们运行的这些进程彼此之间可以感知,看到的"视野"也是一样的,那就无法做到隔离的效果。
2、Namespace隔离进程的本质
运行容器以后, 需要运行一个”主进程”, 这个进程本质上和宿主机的其他进程没太多差别, 只是这个进程看到的“视野”被namespace框住了,只看到自己namespace里面的东西,看不到宿主机上的东西(因为例如在容器和宿主机执行 ls、ifconfig命令,两者命令所处的mount namespace、net namespace不同,所以看到的内容自然不同)。
简单理解, Linux的某种namespace,例如在【视觉】上, 类似给某个人带了"VR眼镜", "VR眼镜"可以将人的视野框起来,现实中你是在床上睡觉(房间就是宿主机), 但是你为了玩游戏感觉更加逼真, 带上"VR眼镜"眼镜的视野就可以身临其境。 但是只有【视觉】身临其境好像还差点意思,此时再给你的【触觉】带上MR混合虚拟设备,这时候就有了模拟触觉体验会更棒,这又是附加了另外一种namespace隔离。
3、Linux提供了哪些类型的Namespace
为了让被虚拟的进程更加"身临其境", Linux内核提供了6种namespace隔离类型与系统调用:
例如主机和域名隔离、信号量隔离、进程PID隔离、网络隔离、挂载隔离、用户信息隔离等。给你的进程套上"虚拟设备", 这样你的进程看到的"视野"和其他进程的"视野"就不一样。
我们运行了一个简单的docker容器,我们可以查看到, 这个命令虽然在Docker容器内运行, 但是宿主机对应路径/proc/$pid/ns中就被分配了各种namespace:
两个进程所处的nemspace不同也就意味着,这两个进程看到的“视野”不同,这个概念很重要.
那反过来讲,如果我们要2个进程可以看到相同“视野”,那么有没有某种机制,让一个进程共享或者切换自己的namespace到目标进程的namespace呢? 这样原进程就可以看到和目标进程一样的“视野”了.
答案是存在的, Linux中存在一个系统调用函数 setns 可以通过系统调用,让某个原进程的namespace切换为目标进程的namespace .
其实docker exec -it /bin/sh 进入一个容器,本质上就是docker cli运行命令, 内部调用setns系统调用(system call), 指定 目标进程id namespace路径: /proc/$pid/ns/ 下的namepscae和要执行的命令/bin/sh传递进去. 这样这个docker cli就能和目标容器看到的“视野”是一样的.
4、验证docker exec /bin/sh,/bin/sh的namespace和容器进程tail 的 namespace是否一致
1、运行一个busybox的容器, 主进程是 tail -f /dev/null
2、宿主机ps aux | grep ‘tail’ 看下这个容器启动进程,在宿主机的实际pid是多少?
拿到实际进程PID: 29493
3.此时我们进入/proc/29493/ns/, 查看下namespace的信息,先做下记录,后续用到.
4.docker-compose exec bb /bin/sh运行进入容器,此时查看宿主机真实进程pid信息:
10325是docker-compose, 子进程是docker cli(10333), 最后, /bin/sh进程pid应该是10372.
5. 查看下/proc/10372/ns的namespace内容, 经过和步骤3的图(容器tail真实进程pid下的ns目录内容)对比,完全一致. 此时通过docker-compose exec bb /bin/sh进入容器后,例如执行ps aux,那么看到的“视野”和容器内部进程的“视野”是一样的,就达到了进入容器查看的目的.
容器内执行ps axu
相关文章:

Docker原理详细剖析-Namespace
一、简介 docker容器技术从2013年开始火了以后,2014年左右当时有幸在学校能和学院教授一起做些项目以及学习。其中docker技术在当时来说还算是比较新的技术,国内关于这块的资料以及使用也才刚刚开始,讨论docker技术,算是相对时髦的…...

sql:SQL优化知识点记录(九)
(1)小表驱动大表 对sql调优的分析: 排序优化: 数据库的连接方式,里面的数据尽量这样连接,尽量选择第一个方式,因为两个表的连接一共建立5次连接,第二个建立1000次连接,从…...

【PowerQuery】PowerQuery导入JSON数据
Json数据是目前使用的最为频繁和广泛的一种数据交换格式,JSON的全称为JavaScript Object Notation。Json 主要用于在互联网的消息的数据交换信息传递,他的格式与XML有什么区别呢?为什么不用XML,用Json有啥好处呢?我们接下来讨论下Json相比XML的优势: XML传递的数据过多服…...
bootstrap 主题
颜色值 根据等级 primarysecondarysuccessinfowarningdangerlightdark 根据名字 blackwhiteblueindigopurplepinkredorangeyellowgreentealcyangraygray-darkbrown 好像是self 加的 根据颜色值的转化 var 变量 –bs-**** 比如:–bs-blue,–bs-pri…...

FPGA 学习笔记:Vivado 工程管理技巧
前言 当前使用 Xilinx 的 FPGA,所以需要熟悉 Xilinx FPGA 的 开发利器 Vivado 的工程管理方法 这里初步列举一些实际 Xilinx FPGA 开发基于 Vivado 的项目使用到的工程的管理技巧 代码管理 做过嵌入式软件或者其他软件开发的工程技术人员,都会想到使用代码管理工具,如 SVN 、…...

Java低代码开发:jvs-list(列表引擎)功能(二)字段及样式配置
字段的增减 进入列表页设计器-页表设计界面,点击新增一行、或者删除按钮,可以对字段进行增减操作,如果对于权限的列表页,可以使用批量创建字段的按钮: 字段的批量设置,点击批量添加如下图所示 字段为中文名…...

【Java】线程都有哪几种状态
文章目录 前言传统线程模型(操作系统)中线程状态Java线程中的状态线程的运行流程 前言 首先我们要知道,在传统(操作系统)的线程模型中线程被分为五种状态,在java线程中,线程被分为六种状态。 …...

为什么服务端会有那么多的 TimeWait ?
工作中无论是开发环境还是线上环境,我们都出现过大量的 timewait 状态的连接,例如下面这个例子 服务端简单的开辟一个 web server 监听 9966 端口 客户端进行疯狂的请求服务端 瞬间就可以看到咱们服务端的出现大量的 TIME_WAIT 状态的连接 这个时候&…...

任意文件读取及漏洞复现
文章目录 渗透测试漏洞原理任意文件读取1. 任意文件读取概述1.1 漏洞成因1.2 漏洞危害1.3 漏洞分类1.4 任意文件读取1.4.1 文件读取1.4.2 任意文件读取1.4.3 权限问题 1.5 任意文件下载1.5.1 一般情况1.5.2 PHP实现1.5.3 任意文件下载 2. 任意文件读取攻防2.1 路径过滤2.1.1 过…...
目前的一些关于机器学习的感悟
目前的一些关于机器学习的想法 大家一直都在说深度学习和积极学习,当我在本科的时候,就听到很多关于这方面的东西,但当时自己对于这些东西的概念较为模糊,随着研究生进一步的学习,我想讲一下,到目前我所理…...
salesforce从sandbox部署到生产环境的自定义字段权限没有成功上载
salesforce从sandbox部署到生产环境的自定义字段权限没有成功上载 只将字段名称和类型上载了。 查阅: https://help.salesforce.com/s/articleView?idsf.deploy_special_behavior.htm&type5 显示: 自定义字段 从 API 版本 30.0 开始,…...

字节跳动推出AI对话工具“豆包”:免费用
我是卢松松,点点上面的头像,欢迎关注我哦! 听说松松客服的小马爆料了一个消息:字节跳动推出了一个新的AI大模型对话工具,叫做“豆包”。竟然一查发现,早在8月18号就已经上线了呢。原来这个“豆包”其实是之…...

时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测
时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络时间序列预测…...
代码随想录训练营二刷第十五天 | 层序遍历10道 226.翻转二叉树 101.对称二叉树 2
代码随想录训练营二刷第十五天 | 层序遍历10道 226.翻转二叉树 101.对称二叉树 2 一、102. 二叉树的层序遍历 题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/ 思路:两次while,内层控制每一行的数量,…...

nowcoder NC10 大数乘法
题目链接: https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&tit…...

非科班菜鸡算法学习记录 | 代码随想录算法训练营第58天|| 单调栈! 739. 每日温度 496.下一个更大元素 I
739. 每日温度 输入一个数组,找比i天温度高的第一天 知识点:单调栈 状态:看思路自己写 思路: 看自己写的注释,维护一个单调栈 // 版本一 class Solution { public:vector<int> dailyTemperatures(vector<…...
【Luogu】 P5445 [APIO2019] 路灯
题目链接 点击打开链接 题目解法 转化很妙 考虑关路灯 x x x 的操作 令左边第一个未关的路灯为 L L L,右边第一个未关的路灯为 R R R,那么这一次会影响的区间即为 l ∈ [ L 1 , x ] , r ∈ [ x , R − 1 ] l\in[L1,x],\;r\in[x,R-1] l∈[L1,x],…...

Kafka3.0.0版本——消费者(独立消费者消费某一个主题中某个分区数据案例__订阅分区)
目录 一、独立消费者消费某一个主题中某个分区数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题中某个分区数据案例 1.1、案例需求 创建一个独立消费者,消费firstTopic主题 0 号分区的数据,所下图所示: 1.2、案…...

基于Simulink的用于电力系统动态分析
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

日200亿次调用,喜马拉雅网关的架构设计
说在前面 在40岁老架构师 尼恩的读者社区(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《API网关项目》,此项目帮这个小伙拿到 字节/阿里/微博/…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...