作者:82年的老代码 | 来源:互联网 | 2023-09-10 11:58
namespace(命名隔离)隔离内容系统调用参数内核版本MNTNamespacemount提供磁盘挂载点和文件系统的隔离能力CLONE_NEWNS2.4.19IPCNamespa
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名称空间机制 :内核级
每个容器都要有独立的根文件系统有独立的用户控件,以实现在容器内启动服务并使用容器的运行环境;即一个是Ubantu服务器,启动一个Centos运行环境的容器并在里面启动一个Nginx服务;此Nginx运行时使用的运行环境是Centos系统目录的运行环境,但是在容器内部是不能访问宿主机资源,宿主机使用chroot
技术把容器锁定到一个指定的运行目录里。即容器家目录
/var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID
验证容器的根文件系统:
一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问;但是不能跨容器访问其他容器的数据。
Unix Timesharing System 包含了运行内核的名称、版本、底层体系结构类型等信息;用于系统表示,其中包含里hostname、域名domainname,它使得一个容器拥有属于自己hostname表示,这个主机名标识独立于宿主机系统和其他的容器
PID为1的进程(init、systemd)是其他所有进程的父进程,那么在每个容器内也有一个父进程来管理其下属的子进程,多个容器的进程通过PID Namespace进程隔离(例如PID编号重复、容器的主进程生成与回收进程)。
例如:下图是在一个容器内使用top命令看到的PID为1的进程是nginx。
容器内的Nginx主进程与工作进程:
那么宿主机的PID究竟与容器内的PID是什么关系?
查看宿主机上的PID信息:
查看容器中的PID信息:
clone() – 实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述参数达到隔离。
unshare() – 使某进程脱离某个namespace
setns() – 把某进程加入到某个namespace
每个容器都类似于虚拟机有一样自己的网卡、监听端口、TCP/IP协议栈等,Docker使用Net Namespace启用一个vethX接口,这样你的容器就拥有自己的桥接IP地址,通常是docker0,而docker0实质就是linux的虚拟网桥,网桥是OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并在不同网络直接传递数据。
查看宿主机的网卡信息:
查看宿主机桥接设备:
通过brctl show 命令查看桥接设备:
#安装bridge-utils
yum install bridge-utils
#查看网桥
brctl show
实逻辑网络图
各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,User Namespace允许各个宿主机的各个容器空间内创建相同的用户名以及相同用户UID和GID,只是会把用户的作用范围限制在每个容器内;即A容器和B容器可以有相同的用户名称和ID账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统;即相互隔离、互不影响、用不详见