Docker底层技术

容器底层技术1-nameapace

No.1 MNT Namespace 提供磁盘挂载点和文件系统的隔离能力
No.2 IPC Namespace 提供进程间通信的隔离能力
No.3 Net Namespace 提供网络隔离能力
No.4 UTS Namespace 提供主机名隔离能力
No.5 PID Namespace 提供进程隔离能力
No.6 User Namespace 提供用户隔离能力

在每一个容器上都可以看到自己的文件系统,网卡等资源,每个容器都会认为自己有独立的网卡即使在宿主机上运维同样有。
Linux实现的方式是namespace.namespace管理着host中全局唯一的资源,让每一个容器都觉的只有自己在使用,实现了容器间资源隔离

  1. pid namespace
    不同的用户进程通过pid namespace 隔离开,且不同namespace可以有相同的PID。
    特征:
    每个namespace 中的pid是由自己pid=1的进程
    每个namespace中的进程只能影响同一个namespace中的进程,或者子namespace中的进程
  2. user namespace
    他是最新的子用户空间,允许创建独立于其他空间之外的用户,通过GID和UID映射实现
  3. mnt namespace
    类似 chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同的是,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。
  4. uts namespace
    他允许容器拥有独立的hostname和domain name,
    使其在网络上可以被视作一个独立的节点而不是HOST上的一个进程。
    简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。
    示例:docker run -it -h node1 centos /bin/bash
  5. net namespace
    网络隔离,
    网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge 连接在一起。
  6. ipc namespace
    container 中进程交互还是采用 Linux 常见的进程间交互方法 (inter process communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VMM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32bit ID。

cgroup
是由linux内核提供的限制,记录和隔离进程组所使用的资源,由Google工程师提出,后来被整合到kernel。
cgroup中的重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的。
首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory限制的子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。
在很多领域可以取代虚拟化技术分割资源。cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源:cpu、mem、iops等

你可能感兴趣的:(Docker,linux运维,docker,运维,容器)