2.Docker基础NameSpace

Posted gmiaomiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.Docker基础NameSpace相关的知识,希望对你有一定的参考价值。

隔离性:namespace

namespace(命名隔离) 隔离内容 系统调用参数 内核版本
MNT Namespace mount 提供磁盘挂载点和文件系统的隔离能力 CLONE_NEWNS 2.4.19
IPC Namespace Inter-Process Communication 提供进程间通信的隔离能力 CLONE_NEWIPC 2.6.19
UTS Namespace Unix Timesharing System 提供主机名隔离能力 CLONE_NEWUTS 2.6.19
PID Namespace Process Identification 提供进程隔离能力 CLONE_NEWPID 2.6.24
Net Namespace network 提供网络隔离能力 CLONE_NEWNET 2.6.29
User Namespace user 提供用户隔离能力 CLONE_NEWUSER 3.8

namespace名称空间机制 :内核级

  • MNT Namespace

每个容器都要有独立的根文件系统有独立的用户控件,以实现在容器内启动服务并使用容器的运行环境;即一个是Ubantu服务器,启动一个Centos运行环境的容器并在里面启动一个nginx服务;此Nginx运行时使用的运行环境是Centos系统目录的运行环境,但是在容器内部是不能访问宿主机资源,宿主机使用chroot技术把容器锁定到一个指定的运行目录里。即容器家目录

/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID

验证容器的根文件系统:
技术图片

  • IPC Namespace

一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问;但是不能跨容器访问其他容器的数据。

  • UTS Namespace

Unix Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息;用于系统表示,其中包含里hostname、域名domainname,它使得一个容器拥有属于自己hostname表示,这个主机名标识独立于宿主机系统和其他的容器
技术图片

  • PID Namespace

PID为1的进程(init、systemd)是其他所有进程的父进程,那么在每个容器内也有一个父进程来管理其下属的子进程,多个容器的进程通过PID Namespace进程隔离(例如PID编号重复、容器的主进程生成与回收进程)。
例如:下图是在一个容器内使用top命令看到的PID为1的进程是nginx。
技术图片
容器内的Nginx主进程与工作进程:
技术图片

那么宿主机的PID究竟与容器内的PID是什么关系?

查看宿主机上的PID信息:
技术图片
查看容器中的PID信息:
技术图片

clone() – 实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述参数达到隔离。

unshare() – 使某进程脱离某个namespace

setns() – 把某进程加入到某个namespace

  • Net Namespace

每个容器都类似于虚拟机有一样自己的网卡、监听端口、TCP/IP协议栈等,Docker使用Net Namespace启用一个vethX接口,这样你的容器就拥有自己的桥接IP地址,通常是docker0,而docker0实质就是linux的虚拟网桥,网桥是OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并在不同网络直接传递数据。

查看宿主机的网卡信息:
技术图片
查看宿主机桥接设备:
通过brctl show 命令查看桥接设备:

#安装bridge-utils
yum install bridge-utils
#查看网桥
brctl show

技术图片

技术图片
实逻辑网络图
技术图片

  • User Namespace

各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,User Namespace允许各个宿主机的各个容器空间内创建相同的用户名以及相同用户UID和GID,只是会把用户的作用范围限制在每个容器内;即A容器和B容器可以有相同的用户名称和ID账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统;即相互隔离、互不影响、用不详见















以上是关于2.Docker基础NameSpace的主要内容,如果未能解决你的问题,请参考以下文章

docker的概念

Docker 简介

[vscode]--HTML代码片段(基础版,reactvuejquery)

namespace基础介绍

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

运行第一个Docker容器