2.1 从进程开始说起

容器本身的价值非常有限, 真正有价值的是“容器编排”。

容器技术的核心功能’就是通过约束和修改进程的动态表现’为其创造一个‘边界,’。

  • 对于Docker等大多数Llnux容器来说, Cgroups技术是用来制造约束的主要手段而Namespace技术是荆来修改进程视图的主要方法.

创建线程系统调用:

  1. int pid = clone(main_function, stack_size, SIGCHLD, NULL);

使用 CLONE_NEWPID 参数:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);

其他障眼法 (Namespace):

  • Mount
  • UTS
  • IPC
  • Network
  • User

容器其实是_种特殊的进程而已

image.png

2.2 隔离与限制

隔离:

image.png

Linux Namespace 的隔离机制相比于虚拟化技术也有很多不足之处’其中最主要的问题就是:隔离得不彻底°

  • 这意味着’如果要在Windows宿主机上运行Ljnux容器’或者在低版本的Linux宿主机上运行高版本的Llnux容器’都是行不通的。
  • Llnux内核中,有很多资源禾‖对象是不能被Namespace化的,最典型的例子就是:时间。
  • 由于上述问题尤其是共享宿主机内核的事实容器向应用暴露的攻击面是相当大的,应用.越狱”的难度自然也比虚拟机低得多°

限制:

  • Linux Cgroups(Linux control groups)就是Linux内核中用来为进程设置资源限制的—个重要功能°

Cgroups向用户暴露出来的操作接口是文件系统:

  • /sys/fs/cgroup

对于Docker等Linux容器项目来说,它们只需要在每个子系统下面为每个容器创建_个控制组(创建—个新目录)’然后在启动容器进程之后’把这个进程的PlD填写到对应控制组的tasks文件中即可°

  • /proc

2.3 深入理解容器镜像

这个挂载在容器根目录上用来为容器进程提供隔离后执行环境的文件系统’就是所谓的』容器镜像”°它还有—个更专业的名字: rootfS(根文件系统)°

  • pivot_roct

需要明确的是’rootfS只是—个操作系统所包含的文件、配置和目录’并不包括操作系统内核°在Llnux操作系统中’这两部分是分开存放的’操作系统只有在开机启动时才会加载指定版本的内核镜像°所以’rootfb只包括操作系统的‘躯壳’’,并不包括操作系统的』灵魂”°

  • /var/lib/docker/aufs/diff/<layer_id>
  • /var/lib/docker/aufs/mnt/<ID>
  • /sys/fs/aufs

image.png

2.4 重新认识 Linux 容器

image.png