深入刨析容器(二):容器的进程

这篇具有很好参考价值的文章主要介绍了深入刨析容器(二):容器的进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这章节主要是从容器的技术概念入手,说一下容器的基础,有了好的基础才能更好的理解容器这门技术,先说一下容器和进程的关系,后续的文章会说进程的隔离与限制资源以及容器的内部灵魂,来一点点深入容器,话不多说,那么开始把!

1.从进程说开去

之前的章节说过容器就是一个“沙盒”,把一个个应用存储在里面,看似是隔离的,那么我们接下来就要讲怎么塑造这样的一个盒子将我们的应用隔离限制起来,那么第一个要说的就是进程,我们运行应用就需要用到进程。

我们的程序都是运行在进程里的,进程的静态表现就是程序,平常都安安静静地待在磁盘上,但是一旦运行起来就变成计算机里的数据和状态的总和,这就是它的动态表现。容器核心的技术实现就是约束和修改进程的动态表现,为其创造出一个“边界”。对于Docker和大部分的linux容器来说,Cgroups技术用来制造约束的手段,Namespace技术则用来修改进程视图的主要方法(后文会讲)。

Linux Cgroups的全称是linux controller group:它最主要的作用就是限制一个进程组能够使用的资源上线,包括CPU、内存、磁盘、网络带宽等等。

1.1 Namespace

动手实践一下理解Namespace,咱们先创建容器试试,

$ docker run -it busybox /bin/sh
/ #

docker run 我们需要启动一个容器,-it 则是容器启动后分配一个文本输入/输出环境,/bin/sh 就是我们要在 docker 容器里运行的程序。

busybox:linux里的命令软件,如ls,cat等等。

上面的命令的意思是:请帮我启动一个容器,在容器里执行 /bin/sh,并且给我分配一个命令行终端跟这个容器交互,这样,Ubuntu 16.04 机器就变成了一个宿主机,而一个运行着 /bin/sh 的容器,就跑在了这个宿主机里面。

此时,如果我们在容器里执行一下 ps 指令,就会发现一些更有趣的事情:

/ # ps
PID  USER   TIME COMMAND
  1 root   0:00 /bin/sh
  10 root   0:00 ps

我们发现第一行的PID是1,运行着/bin/sh,正常情况下我们这个进程肯定不是1,因为我们宿主机运行着大量的进程,也许正常这个PID=100也说不定,那说明已经被 Docker 隔离在了一个跟宿主机完全不同的世界当中,而这种技术就是Linux的Namespace机制

Namespace机制:

Linux的Namespace主要是通过调用系统的Clone()创建进程时指定进程号,比如:

系统调用就会为我们创建一个新的进程,并且返回它的进程号 pid

int pid = clone(main_function, stack_size, SIGCHLD, NULL); 

我们用 clone() 系统调用创建一个新进程时,就可以在参数中指定 CLONE_NEWPID 参数,比如:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 

这时,新创建的这个进程将会“看到”一个全新的进程空间,使其看不到其他的宿主机的进程,当然,我们还可以多次执行上面的 clone() 调用,这样就会创建多个 PID Namespace,而每个 Namespace 里的应用进程,都会认为自己是当前容器里的第 1 号进程,它们既看不到宿主机里真正的进程空间,也看不到其他 PID Namespace 里的具体情况,使其看似隔离,这种技术就是linux的Namespace机制。

其实上述的操作实践也叫PID Namespace,Linux除了给予这样的Namespace方式,Linux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行“障眼法”操作。

如:Mount Namespace :用于让被隔离进程只看到当前 Namespace 里的挂载点信息,Network  Namespace:用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

这就是Linux容器的基本实现原理,

Docker 容器的概念,实际上是在创建容器进程时,指定了这个进程所需要启用的一组 Namespace 参数。这样,容器就只能“看”到当前 Namespace 所限定的资源、文件、设备、状态,或者配置。而对于宿主机以及其他不相关的程序,它就完全看不到了。

容器,只是特殊的一种进程而已。

看完本章节你会发现容器不是真正的虚拟机,还是运用着Linux内核来运行程序,只不过通过了Namespace的手段给屏蔽了,那么既然还是共享着内核,那么就会衍生很多问题,所以下一节会给大家说下容器的隔离与限制。文章来源地址https://www.toymoban.com/news/detail-483375.html

到了这里,关于深入刨析容器(二):容器的进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深入浅出C#】章节 8: 网络编程和远程通信

    计算机网络是指连接多台计算机设备,通过通信链路共享资源和信息的系统。它构建了一个相互连接的世界,使得人们可以在不同地点进行数据交换和资源共享。网络编程是指在计算机网络中,使用编程语言进行通信和数据传输的技术。现代应用中,网络编程发挥着重要作用

    2024年02月07日
    浏览(36)
  • 【深入浅出C#】章节 4: 面向对象编程基础:封装、继承和多态

    封装、继承和多态是面向对象编程中的核心概念,它们对于构建灵活、可扩展和可维护的软件系统至关重要。 封装(Encapsulation)通过将数据和相关操作封装在一个类中,隐藏内部实现细节,并提供公共接口来与外部进行交互。封装有助于保护数据的完整性和安全性,同时提

    2024年02月10日
    浏览(44)
  • 【深入浅出C#】章节10: 最佳实践和性能优化:内存管理和资源释放

    一、 内存管理基础 1.1 垃圾回收机制 垃圾回收概述 垃圾回收(Garbage Collection)是一种计算机科学和编程领域的重要概念,它主要用于自动管理计算机程序中的内存分配和释放。垃圾回收的目标是识别和回收不再被程序使用的内存,以便释放资源并防止内存泄漏,从而提高程

    2024年02月09日
    浏览(46)
  • 【深入浅出C#】章节 9: C#高级主题:多线程编程和并发处理

    多线程编程和并发处理的重要性和背景 在计算机科学领域,多线程编程和并发处理是一种关键技术,旨在充分利用现代计算机系统中的多核处理器和多任务能力。随着计算机硬件的发展,单一的中央处理单元(CPU)已经不再是主流,取而代之的是多核处理器,这使得同时执行

    2024年02月11日
    浏览(49)
  • 【深入浅出C#】章节 5: 高级面向对象编程:泛型编程和集合类型

    高级面向对象编程是在基础面向对象编程的基础上进一步深入和拓展的一种编程范式。它强调封装、继承和多态的概念,并引入了泛型编程和集合类型等高级特性。高级面向对象编程提供了更灵活、可扩展和可复用的代码结构,能够帮助开发者构建更复杂、更高效的应用程序

    2024年02月16日
    浏览(47)
  • 【深入浅出C#】章节 8: 网络编程和远程通信:网络编程和远程通信

    计算机网络是指连接多台计算机设备,通过通信链路共享资源和信息的系统。它构建了一个相互连接的世界,使得人们可以在不同地点进行数据交换和资源共享。网络编程是指在计算机网络中,使用编程语言进行通信和数据传输的技术。现代应用中,网络编程发挥着重要作用

    2024年02月12日
    浏览(51)
  • 【深入浅出C#】章节 1:C#入门介绍:C#开发环境的设置和配置

    一、环境准备 1.1 安装和配置.NET Core 当配置C#开发环境时,安装.NET Core是一个重要的步骤。以下是安装.NET Core的基本过程: 访问官方网站:打开浏览器,访问.NET Core的官方网站:https://dotnet.microsoft.com/en-us/download。 选择下载版本:在官方网站上,选择所需的.NET Core版本。通常

    2024年02月13日
    浏览(42)
  • Scala第二十章节(Akka并发编程框架、Akka入门案例、Akka定时任务代码实现、两个进程间通信的案例以及简易版spark通信框架案例)

    章节目标 理解Akka并发编程框架简介 掌握Akka入门案例 掌握Akka定时任务代码实现 掌握两个进程间通信的案例 掌握简易版spark通信框架案例 1. Akka并发编程框架简介 1.1 Akka概述 Akka是一个用于构建高并发、分布式和可扩展的基于事件驱动的应用工具包。Akka是使用scala开发的库,

    2024年04月11日
    浏览(35)
  • [ELK安装篇]:基于Docker虚拟容器化(主要LogStash)

    1.1.1:地址:https://blog.csdn.net/Abraxs/article/details/128517777 4.1.1:也可以尝试通过挂在目录在宿主机配置文件操作 docker exec -it ae0fbdac223a /bin/sh 配置文件默认信息: 4.1.2:修改默认配置:改成如下配置 4.2.1:配置文件默认信息: 4.2.2:修改填充默认配置文件信息:

    2024年02月15日
    浏览(31)
  • 【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

    🍎 个人博客: 个人主页 🏆 个人专栏:   Mybatis    ⛳️   功不唐捐,玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连接信息 全局配置 映射器扫描 2.SQL映射文件 SQL语句定义 参数映射和

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包