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里面的东西,看不到宿主机上的东西(因为例如在容器和宿主机执行 lsifconfig命令,两者命令所处的mount namespacenet 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

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

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

相关文章

leetcode 1859.将句子排序

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;将句子排序 代码&#xff1a; class Solution { public:string sortSentence(string s) {vector<string> record;record.resize(9);string curString;for (auto val : s) {if (isdigit(val)) {record[ val - 0 - …

数据挖掘导论学习笔记1(第1 、2章)

参考&#xff1a;https://blog.csdn.net/u013232035/article/details/48281659?spm1001.2014.3001.5506 和《数据挖掘导论》学习笔记&#xff08;第1-2章&#xff09;_时机性样本_schdut的博客-CSDN博客 第1章 绪论 数据挖掘是一种技术&#xff0c;它将传统的数据分析方法…

【权限提升-Windows提权】-UAC提权之MSF模块和UACME项目-DLL劫持-不带引号服务路径-不安全的服务权限

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

【LeetCode】297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…

04-Apache Directory Studio下载安装(LDAP连接工具)

1、下载 官网下载Apache Directory Studio 注意Apache Directory Studio依赖于jdk&#xff0c;对jdk有环境要求 请下载适配本机的jdk版本的Apache Directory Studio,下图为最新版下载地址 Apache Directory Studio Version 2.0.0-M16 基于 Eclipse 2020-12&#xff0c;最低要…

安防监控/视频汇聚/视频云存储EasyCVR平台v3.3版本AI智能分析网关V3接入教程2.0

TSINGSEE的边缘计算硬件智能分析网关V3内置多种AI算法模型&#xff0c;包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等&#xff0c;可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合TSINGSEE青犀的视频汇聚/安…

「一体化信息建设」,江苏人社如何完成数据安全管控(建设篇)

2019 年&#xff0c;江苏省人社厅正式启动全省人社一体化信息平台建设项目。省人社一体化信息平台基于全省统一的人社业务标准、规范、流程和数据体系&#xff0c;以群众需求为导向&#xff0c;以省集中建设为重点&#xff0c;以云平台架构为基础&#xff0c;采用人社部 LEAF6.…

百度智能云千帆大模型丨未来人手必备的代码助手

文章目录 1. 前言2. 千帆大模型平台3. 十分友好的功能4. comate代码助手5. 总结 1. 前言 我之前给大家推荐过Poe这个网站&#xff0c;它用的人比较少&#xff0c;但一旦接触后会发现它其实挺强大的。 因为它是一个可以同时支持好几个大模型的在线聚合平台。常用的GPT4&#x…

2.6 PE结构:导出表详细解析

导出表&#xff08;Export Table&#xff09;是Windows可执行文件中的一个结构&#xff0c;记录了可执行文件中某些函数或变量的名称和地址&#xff0c;这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…

归并排序 Merge Sort

归并排序的基本思想是什么&#xff1f; 采用分治法&#xff08;Divide and Conquer&#xff09;&#xff0c;递归将待排序的数组平均分成两个子数组&#xff0c;直到子数组长度为 0 或 1&#xff0c;这是 分 Divider。再将排序好的两个子数组合并为一个有序数组&#xff0c;这…

WINGREEN 034STN1-01-300-R 传感器模块

WINGREEN 034STN1-01-300-R 是一种传感器模块&#xff0c;通常用于监测和采集各种环境或过程参数的数据。以下是这种类型的传感器模块通常可能具备的一般功能和特点&#xff1a; 传感器接口&#xff1a;模块通常配备用于连接不同类型传感器的接口&#xff0c;如温度传感器、湿度…

Android Jetpack Compose 用计时器demo理解Compose UI 更新的关键-------状态管理(State)

目录 概述1.什么是状态2.什么是单向数据流3.理解Stateless和Stateful4.使用Compose实现一个计数器4.1 实现计数器4.2 增加组件复用性-----状态上提 总结 概述 我们都知道了Compose使用了声明式的开发范式&#xff0c;在这样的范式中&#xff0c;UI的职责更加的单一&#xff0c…

VS2022+CMAKE+OPENCV+QT+PCL安装及环境搭建

VS2022安装&#xff1a; Visual Studio 2022安装教程&#xff08;千字图文详解&#xff09;&#xff0c;手把手带你安装运行VS2022以及背景图设置_vs安装教程_我不是大叔丶的博客-CSDN博客 CMAKE配置&#xff1a; win11下配置vscodecmake_心儿痒痒的博客-CSDN博客 OPENCV配…

java八股文面试[多线程]——虚假唤醒

阻塞队列中&#xff0c;如果需要线程挂起操作&#xff0c;判断有无数据的位置采用的是while循环 &#xff0c;为什么不能换成if 肯定是不能换成if逻辑判断 线程A&#xff0c;线程B&#xff0c;线程E&#xff0c;线程C。 其中ABE生产者&#xff0c;C属于消费者 put阻塞代码&a…

FPGA原理与结构——FIFO IP核的使用与测试

一、前言 本文介绍FIFO Generator v13.2 IP核的具体使用与例化&#xff0c;在学习一个IP核的使用之前&#xff0c;首先需要对于IP核的具体参数和原理有一个基本的了解&#xff0c;具体可以参考&#xff1a; FPGA原理与结构——FIFO IP核原理学习https://blog.csdn.net/apple_5…

springboot web开发静态资源的映射规则

前言 我们之间介绍过SpringBoot自动配置的原理&#xff0c;基本上是如下&#xff1a; xxxxAutoConfiguration&#xff1a;帮我们给容器中自动配置组件&#xff1b; xxxxProperties:配置类来封装配置文件的内容&#xff1b; web开发中都在org.springframework.boot.autoconfig…

kubeadm搭建kubernetes(k8s)

kubeadm搭建kubernetes&#xff08;k8s&#xff09; 一、环境准备1.所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换2.修改主机名3.所有节点修改hosts文件4.调整内核参数5.生效参数 二、 安装软件1.所有节点安装docker2.所有节点安装kubea…

Java8实战-总结22

Java8实战-总结22 使用流数值流原始类型流特化数值范围数值流应用&#xff1a;勾股数 使用流 数值流 可以使用reduce方法计算流中元素的总和。例如&#xff0c;可以像下面这样计算菜单的热量&#xff1a; int calories menu.stream().map(Dish::getcalories).reduce(0, Int…

使用spring自带的发布订阅机制来实现消息发布订阅

背景 公司的项目以前代码里面有存在使用spring自带发布订阅的代码&#xff0c;因此稍微学习一下如何使用&#xff0c;并了解一下这种实现方式的优缺点。 优点 实现方便&#xff0c;代码方面基本只需要定义消息体和消费者&#xff0c;适用于小型应用程序。不依赖外部中间件&a…

msvcr120.dll放在哪里?怎么修复msvcr120.dll文件

当您在运行某些应用程序或游戏时遇到“msvcr120.dll缺失”错误时&#xff0c;这可能会影响您的使用体验。msvcr120.dll是Microsoft Visual C Redistributable的一部分&#xff0c;并且它提供了程序运行所需的运行时支持&#xff0c;今天我们来讨论一下msvcr120.dl文件缺失了要怎…