目录

容器核心面试

镜像

镜像是什么东西呢,镜像主要就是包含应用程序所以来的根文件系统 rootfs,这个根文件系统是分层存储的,基础层通常是操作系统的文件,然后在基础层上不断叠加新的层文件,最终组合形成一个完整的镜像。当通过镜像启动容器的时候,镜像所有层都会变成只读,同时额外增加一层读写层,提供给应用程序读写。

rootfs

union mount

image

layer

COW

Copy on Write 是实现 AUFS 等文件系统的核心,意思是当用户在写只读层的文件的时候,文件系统实际上会先把只读层文件复制到读写层,然后再写。

pull

关于镜像是怎么 pull 下来的,这个问题是比较有深度的,以 Docker 为例,考察的是 Docker 的架构。docker 命令实际是通过 grpc 联系到本地的 dockerd 进程,因此实际拉取镜像的是 dockerd 这个进程。

讲讲容器运行时

Linux 提供了 Namespace 和 Cgroup 两个系统功能作为容器的基础,但是要把进程运行在容器中,还需要便捷的 SDK 或命令来调用 Linux 的系统功能,从而创建出容器,容器的运行时就是这样的工具。容器运行时还分为底层、高层的运行时。底层负责运行容器,高层负责为容器准备必要的运行环境,如文件系统、网络等等。

讲讲Linux Namespace

Namespace 是 Linux 操作系统内核的一种资源隔离的方式,使得不同的进程具有不同的系统视图。系统视图就是进程能够感知到的系统环境,如主机名、文件系统、网络协议栈、其他用户和进程等。使用命名空间之后,每个进程都具备独立的系统环境,进程间彼此感觉到不到对方的存在,进程之间互相隔离,Linux 中有6种命名空间,可以嵌套使用。

  1. Mount: 隔离了文件系统的挂载点
  2. Network: 隔离了网络方面的系统资源,包括网络设备、协议栈、路由表、防火墙等
  3. IPC: 进程间相互通信的命名空间,不同命名空间中的进程不能通信
  4. PID: 进程号在不同的命名空间中独立编号
  5. UTS: 系统标识符命名空间,每个命名空间有不同的主机名和NIS域名
  6. User: 命名空间中的用户可以有不同于全局的用户ID和组ID,从而有不同的特权

讲讲Linux Cgroup

Namespace 虽然实现了进程隔离,但是由于各个命名空间中的进程任然共享同样的系统资源,如 CPU,磁盘I/O,内存等等,所以单靠 Namespace 是没有完全打到隔离的目标的,因此有了 Cgroup。Linux 把进程分成控制组,给每组里的进程都设定资源使用规则和限制,发生资源竞争的时候,会根据每个组的定义,按照比例在控制组之间分配资源。Linux 系统通过命名空间设置进程的可见且可用的资源,通过控制组规定进程对资源的使用量,这样真正隔离的环境就形成了。

讲讲虚拟机和容器的融合

虚拟机能够提供硬件级别的虚拟化,相对来说比容器更加安全。vSphere Pod 和 Kata Container 就是虚拟机和容器的融合方案。两种方案是类似的,大概都是把 Pod 运行到一个虚拟机上,然后依然由 Kubernetes 来管理其生命周期。

警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。