Docker原理第二话--Namespace

版权声明: https://blog.csdn.net/m0_37552052/article/details/78344607

Namespace


我们想象一下,一个运行中的Docker容器是跟其他进程处在同一操作系统下的,那么黑客在A container中不就可以随意操作其他进程的文件、跟其他进程通信了吗,这岂不乱套了?所以Docker的核心就是隔离机制,有了隔离机制,才能让每一个Docker容器运行在独自的隔离环境中,保证系统的安全……

Docker的隔离机制主要由Linux的命名空间(Namespace)实现。Namespace由6个成员组成:

MNT Namespace 提供磁盘挂载点和文件系统的隔离能力
IPC Namespace 提供进程间通信的隔离能力
Net Namespace 提供网络隔离能力
UTS Namespace 提供主机名隔离能力
PID Namespace 提供进程隔离能力
User Namespace 提供用户隔离能力


当创建进程的时候,会将要创建的Namespace以参数的形式传入clone函数:

long clone(
        unsigned long flags, 
        void *child_stack, 
        void *ptid, 
        void *ctid,
        struct pt_regs *regs);

其中参数flags可以用表格里的参数进行按位或,以表明子进程需要创建哪些Namespace。


下图是Namespace的创建流程:

这里写图片描述

  1. clone()调用do_fork()函数
  2. 将task和creds复制到新进程
  3. 若要flags中有user,则在creds中添加user namespace,接着创建新的user namespace
  4. 然后在当前user namespace(新的或旧的)创建flags中包含的其他namespace

创建Namespace的系统调用包括clone(), unshare(), setns()

——int unshare(int flags);
调用unshare()的主要作用就是不启动一个新进程就可以起到隔离的效果,相当于跳出原先的namespace进行操作。这样,你就可以在原进程进行一些需要隔离的操作。

接下来我们用unshare来创建namespace:

mnt namespace


这里写图片描述


使用unshare隔离mnt namespace

这里写图片描述


15460和4948两个进程的关系,我们能清楚地看到这是父子关系的两个进程,虽然都是bash

这里写图片描述


在15460进程下创建文件

这里写图片描述


在新开启的终端下看不到文件

这里写图片描述


可以看到mnt在不同的命名空间

这里写图片描述


调用unshare()的主要作用就是不启动一个新进程就可以起到隔离的效果,相当于跳出原先的namespace进行操作。这样,你就可以进行一些需要隔离的操作


ipc namespace


使用unshare隔离ipc namespace

这里写图片描述


在此命令空间下创建消息队列

这里写图片描述


在另一个进程中查找不到刚创建的消息队列,ipc隔离成功

这里写图片描述


net namespace


创建一个net的命令空间,发现是一个纯净的网络空间,连环路地址都没有

这里写图片描述


添加环路地址

这里写图片描述


uts namespace


查看本机hostname

这里写图片描述


在uts命名空间中更改hostname

这里写图片描述


返回原进程查看hostname,发现并没有改变

这里写图片描述


pid namespace


新fork一个在pid namespace的进程,看到在其命名空间里pid显示为1

这里写图片描述


然而这个进程的真是pid是18034

这里写图片描述


user namespace


创建一个user namespace,发现其用户名已变为nobody

这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_37552052/article/details/78344607
今日推荐