Docker与物理机-相爱相杀的隔离机制

前言

很多人问我,docker是通过什么隔离,实现了与物理机的隔离,可以在物理机上运行容器。这样的隔离是否安全,隔离了哪些资源?今天就简单和大家聊一下docker与物理机间的隔离机制。

名称解析

LXC (Linux Container) :内核级的虚拟化 。

namespace :命名空间 ,相当于班级的概念,A班和B班都有小明,可以通过班级这个命名空间进行隔离得以区分。

cgroup :控制组,提供了一套机制用于控制一组特定进程对资源的使用 。

capability :权限限制 。Docker 与 虚拟机的对比

虚拟机是完全虚拟化,用Hypervisor将底层硬件进行了虚拟化,最大的好处是能支持操作系统及软件 。

Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离, 所以说docker是直接使用物理硬件资源,那么docker启动不需要加载内核就可以快速启动。隔离机制

Docker技术通过LXC来实现轻量级的虚拟化,通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制,以满足容器的安全隔离。然而由于Docker容器是共享Linux内核的,所以我们应该认识到容器并非严格全封闭,使用Docker容器一定需要注意保证内核的安全和稳定,需要配合必要的监控和容错。

Linux namespace

六种命名空间:

1) UTS命名空间负责主机名和域名的隔离

使得容器都拥有自己的主机名和域名,可以被看作一个独立的网络节点。

2) IPC命名空间负责信号量、消息队列和共享内存的隔离

其包含了系统IPC标示符以及实现POSIX消息队列的文件系统,使得同一个IPC命名空间下的进程彼此可见,不同的则相互不可见;

3) PID命名空间负责进程PID编号的隔离

不同的PID命名空间下的进程可以有相同的PID,每个PID命名空间都有独立的计数程序。

4) Network命名空间负责网络资源的隔离

这里的隔离并非真正意义的网络隔离,而是把容器的网络独立出来,如同一个独立的网络实体来与外部通信。

5) Mount命名空间负责挂载点的隔离

不同Mount命名空间下的文件结构发生变化互不影响。

6) User命名空间负责安全相关的标示符和属性的隔离

包括用户ID、用户组ID、root目录、密钥key以及特殊权限等,该命名空间技术支持进程在容器内外拥有不同级别的权限。

cgroup

四种功能

1) 资源限制

对任务使用的资源总量进行限制,如应用在运行时超过上限配额就会给与提示。

2) 优先级分配

通过分配的CPU时间片数量及磁盘IO带宽大小,实际上就相当于控制了任务的优先级。

3) 资源统计

可以统计系统的资源使用量,如CPU、内存等使用情况。

4) 任务控制

可以对任务进行挂起、恢复等操作。

capability

Linux支持把超级用户不同单元的权限分离,可以单独的开启和禁止,即capability的概念。

可以将capability赋给普通的进程,使其可以做root用户可以做的事情。内核在验证进程是否具有某项权限时,不再验证该进程的是特权进程(有效用户ID为0)和非特权进程(有效用户ID非0),而是验证该进程是否具有其进行该操作的capability。不合理的禁止capability,会导致应用崩溃。目前Docker默认启用一个严格capability限制权限,同时支持开发者通过命令行来改变其默认设置,保障可用性的同时又可以确保其安全。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();