Docker核心技术:Docker原理之Namespace

云原生学习路线导航页(持续更新中)

本文是 Docker核心技术 系列文章:Docker原理之Namespace,其他文章快捷链接如下:

  • 应用架构演进
  • 容器技术要解决哪些问题
  • Docker的基本使用
  • Docker是如何实现的
    • Docker核心技术:Docker原理之Namespace(本文)
    • Docker核心技术:Docker原理之Cgroups
    • Docker核心技术:Docker原理之Union文件系统

4.1.容器标准

  • 发展故事
    • 当时Docker特别火热,横扫业界的容器技术,发展迅速。谷歌不甘示弱,接着开源了kubernetes
    • 但是kubernetes刚出来,是打不过docker的,所以谷歌采用了标准化的手段来和Docker竞争
    • 谷歌提出了容器的标准OCI,让Docker来接入自己,可Docker认为自己是事实标准,不同意接入
    • 于是谷歌找到了其他的一些大厂,推进标准化,在kubernetes中支持docker之外的runtime来竞争
    • 另一方面,Docker本身也存在一些问题,比如迟迟没有盈利点、发展太快导致管理混乱等
    • 随着kubernetes越来越强,Docker不得不服软,同意接入OCI

在这里插入图片描述

  • Docker的创举主要在第二个规范
    • Docker创造性的利用OverlayFS,实现了镜像分层的打包方式。
    • 比如一个镜像有4层,在pull image的时候,如果发现前3层没有变化,则直接可以使用本地的缓存
    • 这种方式解决了业界非常头疼的 文件分发 的问题,所有公司不需要自己再考虑文件分发,程序拷贝等问题
      • 以Docker Repository作为公共的File Server(不需要每个公司自己建一个自己的)
      • 以Docker Engine作为公司机器上用于接受指令的Agent

4.2.容器主要特性

在这里插入图片描述

  • 安全性
  • 隔离性:namespace
  • 便携性
  • 可配额:cgroup

4.3.Namespace:隔离性

4.3.1.Namespace是什么

在这里插入图片描述

  • Linux内核中,Namespace的实现

    在这里插入图片描述

    • 无论进程还是线程,在Linux Kernel来看,都是一个Task,每一个Task,都有一个nsproxy的属性
    • nsproxy结构中,包含5个namespace:uts_ns、ipc_ns、mnt_ns、pid_ns、net_ns

4.3.2.进程如何分到namespace

  • LinuxOS 第一个进程,一般是systemd,pid=1,会分给它一个默认的namespace

  • 启动其他进程时,对namespace的操作方法,包括:

    • clone:可以为进程指定新的namespace
    • setns:通过系统调用,把进程加入已经存在的namespace
    • unshare:通过系统调用,把进程移到新的namespace下

    在这里插入图片描述

4.3.3.Namespace的类型

  • 不同Namespace所支持的Linux Kernel版本如下:

    • 现在我们用的Kernel都很新了,一般都是支持的
    • 后面演进中,可能还会有新的ns出现,不过现在kubernetes支持的就这些

    在这里插入图片描述

  • 理解不同ns的关系和区别

    在这里插入图片描述

  • 不同ns详解

    • Docker本身把这些ns都实现了,不过kubernetes利用这些ns时稍有不同
    • 比如namespace本身是不可以嵌套的,但是kubernetes中namespace是可以嵌套的

    在这里插入图片描述
    在这里插入图片描述

  • 对于进程来说

    • 一个进程,有了独立的主机名、独立的ip地址、独立的user namespace用户管理,那么实际上就是拥有了一个虚拟的OS
  • 对于应用开发人员来说

    • 一个服务,有了独立的网络身份,有独立的ip+port,就达到了微服务的目的

4.3.4.Namespace常用操作

在这里插入图片描述

  • lsns:list当前主机上所有的ns

  • lsns -t :list指定类型的ns

  • ls -la /proc//ns/:查看指定进程的ns

  • nsenter -t -n ip adds:进入指定进程的指定ns中,执行指定命令

    • 比如这里写的就是,进入指定pid进程的 -n网络ns中,执行 ip addr 命令

    • 这条命令非常常用,比如现在容器遇到了问题,但是docker的image非常小,没有各种调试命令,那么你就可以在主机上找到容器对应的pid,进入ns去查看和调试

    • 示例:在容器中执行命令—在主机上进入指定ns后执行命令,结果是一样的

      在这里插入图片描述

4.3.5.namespace练习

在这里插入图片描述

  • 打开两个终端,一个执行命令,一个查看进程信息

    • 执行命令之后,这个终端会暂停在这里60s,要抓紧查看,要不就退出来了

      在这里插入图片描述

    • 查看进程信息,pid为15368
      在这里插入图片描述

    • 查看这个进程所在的net ns,果然在一个新的net ns

      在这里插入图片描述

    • 进入该进程的net ns,执行命令 ip a

      • 可以看到,这个进程只有一个lo,没有eth0。因为我们只是启动了一个进程,没有人为它配置ip

        在这里插入图片描述

      • 而docker容器之所以有eth0,是因为docker有自己的网络插件,会为容器配ip,比如下面是一个docker容器,docker使用bridge模式为其分配了一个172.17.0.2/16的ip

        在这里插入图片描述

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

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

相关文章

多模态AI:概念、用例、优势、挑战及发展未来

多模态实际上是在尝试复制人类的感知方式:我们将视觉、声音和触觉等感官输入结合起来,形成对现实的更细致入微的感知,并利用这些数据来做出决定或采取行动。多模态模式也在尝试做同样的事情。 多模态AI的应用范围正在不断扩大,那么…

【Spring】深入理解了IOC(控制反转)和DI(依赖注入)

学习时间:09:XX--10:28,50min 微信读书 今日学习Spring框架,有很大的收获,感觉是学习SpringBoot以来的一个里程碑,因为今天上午这50min理解了Spring框架的核心基础,控制反转&#x…

使用 useLazyAsyncData 提升数据加载体验

title: 使用 useLazyAsyncData 提升数据加载体验 date: 2024/7/19 updated: 2024/7/19 author: cmdragon excerpt: 摘要:本文介绍useLazyAsyncData函数在Nuxt 3中的使用,以提升数据加载体验。此函数支持异步获取数据并在组件中处理挂起与错误状态&…

生成式AI在IT领域的应用中,对产品,UI设计师,前端开发。后端开发,运维的影响?

生成式AI在IT领域的应用将对产品、UI设计师、前端开发、后端开发和运维等多个角色产生深远影响。 以下是对这些角色的具体影响、技术对比以及未来展望的分析: 产品经理 影响革新: 精准需求洞察:生成式AI深度挖掘市场数据与用户反馈&#xff0…

IOCTLance:一款针对x64 WDM驱动程序的漏洞检测工具

关于IOCTLance IOCTLance是一款针对x64 WDM驱动程序的漏洞检测工具,该工具来源于CODE BLUE 2023上展示的一个名为“使用符号执行和污点分析增强 WDM 驱动程序漏洞检测 ”的项目。该工具能够有效增强检测Windows驱动程序模型(WDM)驱动程序中各…

Redis之List列表

目录 一.列表讲解 二.列表命令 三.内部编码 四.应用场景 Redis的学习专栏:http://t.csdnimg.cn/a8cvV 一.列表讲解 列表类型是用来存储多个有序的字符串,如下所示,a、b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的…

标准IO中fopen函数返回的FILE*指针的存储位置

程序的内存分配: 一个由C/C编译的程序占用的内存分为以下几个部分 1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 …

软链接跟硬链接有什么区别

‌软连接和‌硬连接是‌linux文件系统中的两种不同类型的链接,它们的主要区别在于: 本质不同:硬连接是同一文件的不同名称,而软连接则指向另一个文件或目录的路径。硬连接与原始文件共享相同的inode信息,因此它们指向同…

微软史诗级的蓝屏

本周经历了微软的蓝屏,一直到周末还在加班处理公司的问题。 个人终端受到的影响较大,服务器上也受到了影响。因为蓝屏的事情导致不少麻烦,据同事说因为蓝屏的问题,MGH 的手术安排也受到了影响。 目前我们也在着手处理有部署 Wind…

【Apollo学习笔记】—— Cyber RT之创建组件, test ok

0. 前置知识 这部分内容详见第三章:Component组件认知与实践https://apollo.baidu.com/community/article/1103 0.1 什么是 Component Apollo 的 Cyber RT 框架是基于组件(component)概念来构建的。每个组件都是 Cyber RT 框架的一个特定的算法模块, 处理一组输入并产生其…

Leetcode 3227. Vowels Game in a String

Leetcode 3227. Vowels Game in a String 1. 解题思路2. 代码实现 题目链接:3227. Vowels Game in a String 1. 解题思路 这一题稍微分析一下之后就会发现,这个游戏有且只有一种情况Bob才能够赢,即原始字符串当中不存在元音字母的情况&…

算法:优先级队列(堆)

目录 题目一:最后一块石头重量 题目二:数据流中的第 K 大元素 题目三:前 K 个高频单词 题目四:数据流的中位数 题目一:最后一块石头重量 有一堆石头,每块石头的重量都是正整数。 每一回合&#xff0c…

基于SpringBoot+Vue的网吧管理系统(带1w+文档)

基于SpringBootVue的网吧管理系统(带1w文档) 基于SpringBootVue的网吧管理系统(带1w文档) 网吧管理系统,为了随时随地查看网吧管理信息提供了便捷的方法,更重要的是大大的简化了管理员管理网吧的方式方法,更提供了其他想要了解网吧管理信息及…

Unity如何使摄像机视锥体外的物体不被剔除

在默认情况下,Unity在渲染场景时会剔除掉摄像机视椎体以外的所有物体,这就会导致某些特殊情况下,我们希望显示在场景中的物体反而被剔除了,比如用Shader制作顶点动画时,如果物体本身的位置在摄像机以外,而顶…

【云原生】Prometheus 服务自动发现使用详解

目录 一、前言 二、Prometheus常规服务监控使用现状​​​​​​​ 2.1 Prometheus监控架构图 2.2 Prometheus服务自动发现的解决方案 三、Prometheus服务自动发现介绍 3.1 什么是Prometheus服务自动发现 3.2 Prometheus自动服务发现策略 3.3 Prometheus自动服务发现应用…

SQL39道常见题型

SQL1 查询所有列 现在运营想要查看用户信息表中所有的数据,请你取出相应结果。 select * from user_profile 结果: SQL2 查询多列 还是上面那个输入,题目换成:现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#…

Springboot同时支持http和https访问

springboot默认是http的 一、支持https访问 需要生成证书,并配置到项目中。 1、证书 如果公司提供,则直接使用公司提供的证书; 如果公司没有提供,也可自己使用Java自带的命令keytool来生成: (1&#x…

Flink History Server配置

目录 问题复现 History Server配置 HADOOP_CLASSPATH配置 History Server配置 问题修复 启动flink集群 启动Histroty Server 问题复现 在bigdata111上执行如下命令开启socket: nc -lk 9999 如图: 在bigdata111上执行如下命令运行flink应用程序 …

windows下玩转DockerDesktop--学习笔记

视频链接 Window下玩转Docker Desktop_哔哩哔哩_bilibili 安装ubuntu 安装wsl 网站 安装 WSL | Microsoft Learn winr 输入powershell,输入 wsl --install 通过修改Hosts解决国内Github经常抽风访问不到 网址 maxiaof/github-hosts: 通过修改Hosts解决国内G…

手动构建线性回归(PyTorch)

import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt import random #1.构建数据 #构建数据集 def create_dataset():x,y,coefmake_regression(n_samples100,n_features1,random_state0,noise10,coefTrue,bias14.5)#将构建数据转换为张…