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账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统;即相互隔离、互不影响、用不详见