首先我们抛出3个问题:
- docker容器的内核与宿主机内核是怎样的关系?
- 容器在运行时如何调用系统资源?
- docker的性能参数有没有作用范围?
能够将这3个问题全部解答,关于docker的内核与调优策略便有了一定程度的认识。
一、容器与宿主机的内核关系 —— 共享内核
docker镜像是一个“应用程序和它运行依赖环境”的封装。当镜像运行起来后,即是docker容器。运行时的容器本质是操作系统下的一个进程,这些进程共享同一个宿主机OS的内核。
与传统VM相比,docker是一种操作系统虚拟化技术,并不需要在镜像内安装GuestOS。
docker在共享宿主机内核的基础上包装内核提供的一系列API,这些API中最重要的就是namespace和cgroup。通过namespace实现隔离,通过cgroup实现资源限制。
二、Namespace--命名空间
- PIDnamespace:每当在此空间中启动一个程序,内核就给它分配唯一的ID。与宿主机所见的不同,容器内的进程都有自己的进程ID空间。
- MNTnamespace:每个容器都有自己目录挂载的命名空间。
- NETnamespace:每个容器都有自己单独的网络栈,其中的socket和网卡设备都是其他容器不能访问的。
- UTSnamespace:在此命名空间中的进程拥有自己的主机名和NIS域名。
- IPCnamespace:拥有相同IPC命名空间的进程才可以利用“共享内存、信号量、消息队列”方式进行通信。
- User namespace:用于隔离容器中的UID,GID和根目录<