1. 容器本质
容器本质上是一种进程隔离的技术。容器为进程提供了一个隔离的环境,容器内的进程无法访问容器外的进程。
容器是一个进程,在容器中启动进程,其实就是在容器这个父进程下启动一个子进程。并且使用“障眼法”对这个子进程的进程编号进行了重新编号,使得用户在容器中查看进程时,如同身处于一个OS环境中。
容器本质之文件隔离
使用chroot来实现文件隔离
容器的本质是进程隔离,那么容器与外部之间也会存在着文件的隔离。文件系统隔离,这也是容器概念的起始。
容器的概念始于 1979 年的 UNIX chroot,它是一个 UNIX 操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。
容器本质之Namespace
Namespace的类别
在后面的容器技术中,实现上都离不开Linux的Namespace技术。Namespace 是 Linux 提供的一种内核级别环境隔离的方法。Namespace的隔离有6大分类:
每个进程都有自己的namespace的id。可以通过ls -l 来查看。
1.进程命名空间
通过进程命名空间管理进程号,对于同一进程,在不同的命名空间,看到的进程号不同。
启动docker服务,会以父进程的身份启动docker-containerd进程,每启动一个容器,会为每个容器启动一个docker-containerd-shim进程,作为该容器内所有进程的根进程,进程号为0
2.IPC(Interprocess Communication)命名空间
包括信号量,消息队列和共享内存等方式,PID命名空间,同一个IPC命名空间内的进程彼此可见,允许进行交互
3.网络命名空间
一个网络命名空间为进程提供一个完全独立的网络协议栈的视图。包括网络设备接口IPv4、IPv6协议栈、IP路由表、防火墙、sockkets等
docker采用虚拟网络设备(virtual Network Device)将不同命名空间的网络设备连接到一起,
4.挂载命名空间
将一个进程的根文件系统限制到一个特定的目录下,不同命名空间的进程都认位自己独占一个完整的根文件系统
5.UTS命名空间
UTS(UNIX Time-sharing System)命名空间允许每个容器都有自己的独立的主机名和域名,从而可以虚拟出一个独立主机名和网络空间的环境
就跟网络上独立一台主机一样。如果没有指定名字,docker会返回容器ID的前6位
6.用户命名空间
每个容器上的可以有不同的用户和组ID,也就是说,可以在容器内使用特定的内部用户执行程序,而非本地系统上存在的用户,
每个容器内都可以有最高权限root账号,跟宿主主机不在同一个命名空间,通过使用隔离的用户命名空间,提高安全性,避免容器内的进程获取到额外的权限
控制组
Cgroups
linux内核的一个特性,主要对共享资源进行隔离,限制,审计等
- 资源限制:内存限制,设置上限,一旦超过就会
- 优先级:让一些组优先的得到更多的CPU等资源
- 资源审计:用来统计系统实际上把多少的资源用到适合的目的上,可以使用cgroup子系统记录某个进程使用CPU的时间
- 隔离:为组隔离命名空间,这样使得组不会看到另一个组的进程,网络和文件系统,
- 控制:执行挂起、恢复和重启操作