容器本身没有价值,有价值的是“容器编排”。
容器,其实是一种特殊的进程而已。

Linux 容器的具体实现方式

一个“容器”,实际上是一个由 Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。

  1. Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”;修改进程视图的主要方法
  2. Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。制造约束的主要手段
  3. 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。

namespace机制

在容器中看到只有自己一个进程
但是这个进程其实是在宿主机上的 只不过是一个独立的namespace

定义了5个命名空间结构体,多个进程可以使用同一个namespace

  1. UTS: 运行内核的名称、版本、底层体系结构类型等信息(UNIX Timesharing System)
  2. IPC: 与进程间通信(IPC)有关
  3. MNT: 已经装载的文件系统的视图 Mount Namespace,用于让被隔离进程只看到当前 Namespace 里的挂载点信息;
  4. PID:有关进程ID的信息
  5. NET:网络相关的命名空间参数 Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间

cgroup技术

Linux Cgroups 就是 Linux 内核中用来为进程设置资源限制的一个重要功能。
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
此外,Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作

一个正在运行的 Docker 容器,其实就是一个启用了多个 Linux Namespace 的应用进程,而这个进程能够使用的资源量,则受 Cgroups 配置的限制。这也是容器技术中一个非常重要的概念,即:容器是一个“单进程”模型。

centos ubuntu等本来就是用的相同的linux内核,但是其他操作系统的一些可执行文件等等就是各个linux发行版不同的地方了。