基于Docker技术的容器隔离性分析
【摘要】Docker技术是一种基于Linux操作系统内核的虚拟化技术,其主要在于借助对LXC(Linux Container)的扩展而达到一种虚拟化的解决方案。其能够保障每一个容器中服务的运行环境是保持隔离的,这主要是通过内核命名空间的特性来完成。由于Docker隔离机制的独特性,运行资源的开销较低,能够很好地保障虚拟化的密度。文章基于Docker的工作原理展开研究,对Docker的虚拟化隔离技术及容器隔离方案做出了详尽的分析与讨论。
【关键词】Docker技术;隔离性;虚拟化
Docker是一个基于LXC的高级应用容器引擎,其进一步优化了容器的使用体验,提供了容器管理的一些功能,如容器的版本管理、容器发布、容器移植等,让使用者更方便的使用容器。Docker具备简化配置的优点,其能够让开发者把应用程序以及程序所依靠的运行环境和配置文件一同打包,达到“Build Once,Run Everywhere”的目标,具备资源安全访问的特质,能够完成系统的隔离,具备轻量虚拟化的特质,与传统虚拟化对比,其具有启动速度更快与占用的资源较少的优点。Docker最重要的特点在于其支持由任何编程语言和框架开发的应用程序,使得Docker在互联网领域被广泛使用。
1.Docker技术原理
用户使用Docker客户端与DockerDaemon建立通讯,Docker Daemon提供Server的功能使其可以接受Docker客户端的请求;Engine以任务的形式处理Docker的内部工作,如从镜像仓库下载镜像并以Graph的形式保存,建立Docker容器网络,限制Docker资源配额及者执行用户指令等;Libcontainer是一项独立的容器管理包,实现对容器的具体操作。Docker客户端与Docker Daemon能够通过RESTful或socket接口通讯。其结构模式详见图1。
图1 Docker结构
2 Docker与虚机机的比较
目前流行的完全虚拟化就是使用了Hypervisor软件将底层硬件进行了抽象模拟,其好处在于可以支持针对物理硬件设计的操作系统及软件,且支持多个异构的GuestOS,提供了较好的GuestOS的独立性。但是其缺点是损失部分系统性能。
容器是基于Linux内核的虚拟化技术,其依赖内核的相关特性实现隔离,与完全虚拟化的虚拟机不同,它不需要Hypervisor实现虚拟化宿主机的物理硬件,而是直接使用实际的物理硬件资源,更像是一个应用程序与宿主机之间的交互。此外,容器使用宿主机的内核,,省略了内核加载步骤,启动更加快速。
3.隔离性
由于每个虚拟机都有自己的GuestOS,从而保证了虚拟机之间的隔离,进而达到同一宿主机上不同虚拟机间互不干扰的目的。Docker容器是借助系统内核来进行安全性的隔离。即是通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制。
但同一台宿主机的内核却是共享的,多个容器的系统调用其实都是通过宿主机的内核处理,这为Docker留下了一定的安全隐患。因此,我们应该认识到容器并不是全封闭隔离的。
3.1用户命名空间隔离
Docker容器使用了Linux内核中提供的6种命名空间隔离:
1) UTS命名空间负责主机名和域名的隔离,使得容器都拥有自己的主机名和域名,可以被看作一个独立的网络节点。
2) IPC命名空间负责信号量、消息队列和共享内存的隔离,其包含了系统IPC标示符以及实现POSIX消息队列的文件系统,使得同一个IPC命名空间下的进程彼此可见,不同的则相互不可见;
3) PID命名空间负责进程PID编号的隔离,不同的PID命名空间下的进程可以有相同的PID,每个PID命名空间都有独立的计数程序。
4) Network命名空间负责网络资源的隔离,这里的隔离并非真正意义的网络隔离,而是把容器的网络独立出来,如同一个独立的网络实体来与外部通信。
5) Mount命名空间负责挂载点的隔离,不同Mount命名空间下的文件结构发生变化互不影响。
6) User命名空间负责安全相关的标示符和属性的隔离,包括用户ID、用户组ID、root目录、密钥key以及特殊权限等,该命名空间技术支持进程在容器内外拥有不同级别的权限。
3.2cgroup资源限制
Docker容器通过cgroup来实现组进程并管理它们的资源总消耗,分享可用的硬件资源到容器并限制容器的内存和CPU的使用,cgroup提供了以下4大功能:
1) 资源限制:对任务使用的资源总量进行限制,如应用在运行时超过上限配额就会给与提示;
2) 优先级分配:通过分配的CPU时间片数量及磁盘IO带宽大小,实际上就相当于控制了任务的优先级;
3) 资源统计:可以统计系统的资源使用量,如CPU、内存等使用情况;
4) 任务控制:可以对任务进行挂起、恢复等操作。
3.3 capability权限限制
从Linux内核2.2版本开始,Linux支持把超级用户不同单元的权限分离,可以单独的开启和禁止,即capability的概念。可以将capability赋给普通的进程,使其可以做root用户可以做的事情。内核在验证进程是否具有某项权限时,不再验证该进程的是特权进程(有效用户ID为0)和非特权进程(有效用户ID非0),而是验证该进程是否具有其进行该操作的capability。不合理的禁止capability,会导致应用崩溃。目前Docker默认启用一个严格capability限制权限,同时支持开发者通过命令行来改变其默认设置,保障可用性的同时又可以确保其安全。
4.结束语
Docker技术通过LXC来实现轻量级的虚拟化,通过namespace进行隔离、cgroup进行资源限制、capability进行权限限制,以满足容器的安全隔离。然而由于Docker容器是共享Linux内核的,所以我们应该认识到容器并非严格全封闭,使用Docker容器一定需要注意保证内核的安全和稳定,需要配合必要的监控和容错。
参考文献
[1]刘思尧,李强,李斌.基于Docker技术的容器隔离性研究[J].软件,2015,(04):110-113.
[2]马越,黄刚.基于Docker的应用软件虚拟化研究[J].软件,2015,(03):10-14.
[3]杨莎莎,邹华.托管Paas平台安全容器的设计与实现[J].软件,2012,33(12):15.
更多推荐
所有评论(0)