手写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

相关文章

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

docker 重命名镜像的实现方法

《docker重命名镜像的实现方法》在Docker中无法直接重命名镜像,但可通过添加新标签、删除旧镜像后重新拉取/构建,或在DockerCompose中修改配置文件实现名称变更,感兴趣的可以了解一下... 目录使用标签(Tagging)删除旧的php镜像并重新拉取或构建使用docker Compose在Do

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

Docker多阶段镜像构建与缓存利用性能优化实践指南

《Docker多阶段镜像构建与缓存利用性能优化实践指南》这篇文章将从原理层面深入解析Docker多阶段构建与缓存机制,结合实际项目示例,说明如何有效利用构建缓存,组织镜像层次,最大化提升构建速度并减少... 目录一、技术背景与应用场景二、核心原理深入分析三、关键 dockerfile 解读3.1 Docke

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp