首先我们抛出3个问题:

  1. docker容器的内核与宿主机内核是怎样的关系?
  2. 容器在运行时如何调用系统资源?
  3. 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和根目录<