手写docker:你先玩转namespace再来吧

2024-06-23 01:36

本文主要是介绍手写docker:你先玩转namespace再来吧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

哈喽,我是子牙老师。今天咱们聊聊Linux namespace

瓦特?你没听过namespace?那有必要科普一下了:namespace是Linux内核提供的一种软件性质的资源隔离机制。容器化技术,比如docker,就是基于这样的机制实现的。namespace,是docker依赖的最核心的技术。如果没有namespace,就没有容器化技术,也就没有云原生
在这里插入图片描述

甚至可以说,如果没有namespace,云计算都将不复存在
在这里插入图片描述

你现在应该知道namespace对今天这个科技世界的重要性了,那你想不想深入了解一下它:

  1. namespace资源隔离,听起来很抽象,有木有?如何具象理解namespace是如何实现资源隔离的?实现了哪些资源的隔离?
  2. 所有的进程有默认的namespace吗?还是不配置就没有?
  3. 如何给进程配置namespace
  4. 如何从用户态查看进程的namespace
  5. 如何从内核态查看进程的namespace
  6. docker exec与namespace的关系

正文开始,enjoy

如果现实中有namespace

比如你爸买了个大house,内部是这样的
在这里插入图片描述

过了N年,你生了好几个娃,娃都长大了,一个厕所、厨房不够用了,开始改造大house
在这里插入图片描述

Linux namespace差不多就是这种感觉,如果你没有给进程创建新的namespace的时候,所有的进程都在默认的namespace中
在这里插入图片描述

如果你给进程100设置了PID namespace,这时候就变成这样了
在这里插入图片描述

默认PID namespace中的进程100(100是进程的PID哦),在新的PID namespace中,就变成了PID为1的进程

你以为namespace的功能就只是这样了吗?那你就
在这里插入图片描述

它还支持套娃!啥意思呢?如图
在这里插入图片描述

什么意思呢?就是容器,是可以嵌套的!就问你牛不牛?

你是不是想问:那能嵌套多少层呢?答案是:无限层!

嗯,写这玩意的哥们一定是个渣男吧!不够专一!如果我来写,我肯定不支持嵌套,这样我肯定是万千女程序员的理想型!

进程默认namespace

现在我们已经知道进程有默认的namespace,如何查看呢?我们先从用户态查看
在这里插入图片描述

后面的数字是啥?inode number。底层是通过vfs inode将文件与namespace相关联的

再从内核态查看每个进程的namespace。了解Linux的都知道,Linux中的所有进程都是1号进程的子孙进程,言外之意就是所有进程都会继承1号进程的namespace,来看看是不是这么回事

先看1号进程的namespace信息
在这里插入图片描述

再看2号进程的namespace,你会发现是一样的
在这里插入图片描述

这时候再看我写的docker进程,因为它底层实现了namespace隔离,所以是不一样的
在这里插入图片描述

在这里插入图片描述

进程默认的namespace是怎么来的?init_task是0号进程,俗称Linux的始祖进程
在这里插入图片描述

对了,你是不是想问:如何从Linux内核态查看namespace?这个你得写内核驱动。这是我准备做的另外一件事:我在研究Linux内核的过程中,写了很多针对查看Linux内核、控制Linux内核的功能,等写到一定程度,我会分享给大家使用。

进程定制不一样的namespace

那如何为进程设置namespace呢?两种方式:
1、可以通过使用函数clone创建进程实现
2、如果是通过fork创建的子进程,通过使用函数unshare为进程配置新的namespace
在这里插入图片描述

这两种方式,在docker实现中,都会用到

docker exec底层本质

看到这里,你应该知道答案了吧,你进入对应进程的namespace,就相当于进入了进程
在这里插入图片描述

给你个没有答案的问题:如果进程A实现了所有namespace:UTC、IPC、PID、USER、NET、FS,进程B只进入其中的一直可不可以?会带来什么问题?

这篇关于手写docker:你先玩转namespace再来吧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085958

相关文章

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署