ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Docker实现进程隔离的方式

2022-02-07 21:32:22  阅读:327  来源: 互联网

标签:IPC 隔离 namespace PID 进程 Docker 节点


前言

Docker其实并没有实现什么新的技术,而是在Linux的系统调用之上做了封装,达到了非常好的用户体验,让人们感觉好像是跑的一个虚拟机一样。


Docker通过Linux的namespace机制实现进程隔离

对比虚拟机技术在同一个宿主机上建立多个操作系统实现的彻底的进程隔离,这样的实现方式要跑多个操作系统,带来了非常大的资源开销。而Docker容器技术则是通过一系列的namespace实现进程隔离,这是一种内核级别隔离系统资源的方法。

namespace隔离类型:

  • UTS namespace
    UTS(UNIX Time-sharing System)namespace提供了主机名与域名的隔离,这样每个docker容器就可以拥有独立的主机名和域名了,在网络上可以被视为一个独立的节点,而非宿主机上的一个进程。
  • IPC namespace
    进程间通信(Inter-Process Communication, IPC)涉及的IPC资源包括常见的信号量、消息队列和共享内存。在同一个IPC namespace 下的进程彼此可见,不同IPC namespace下的进程则互相不可见。
  • PID namespace
    PID namespace隔离非常实用,它对进程PID重新标号,即两个不同namespace 下的进程可以有相同的PID。每个PID namespace都有自己的计数程序。内核为所有的PID namespace维护了一个树状结构,最顶层的是系统初始时创建的,被称为root namespace,它创建的新PID namespace被称为child namespace(树的子节点)。通过这种方式,不同的PID namespace会形成一个层级体系。所属的父节点可以看到子节点中的进程,并可以通过信号等方式对子节点中的进程产生影响。反过来,子节点却不能看到父节点PID namespace中的任何内容。

Linux的namespace详细参见:浅谈Linux Namespace机制


效果演示

Docker是通过clone()接口在创建新进程的同时创建namespace。

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

我们在宿主机上使用ps aux查询该操作系统中所有的进程,可以发现有这么多
在这里插入图片描述
创建一个容器并进入到容器内部,同样执行ps aux,发现就两个
在这里插入图片描述

标签:IPC,隔离,namespace,PID,进程,Docker,节点
来源: https://blog.csdn.net/qq_38003038/article/details/122814031

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有