使用Docker打造自己的渗透测试容器之—理论篇
00x0 Docker简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖任何语言、框架,甚至操作系统。
00x1 虚拟化容器的优势
随着公有云的普及,开发者越来越需要一个快速迁移和高速构架应用的环境。现在开发者需要能方便的创建运行在云平台上的应用,也就是说应用必须能够脱离底层机器。而且同时必须是方便获取的。因此,开发者需要一种创建分布式应用程序的方式,这也就是Docker所能提供的。
00x2 Docker在开发和运维中的优势
对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,然而可以在任意环境、任意时间上让应用正常的运行。而Docker恰恰可以实现这一终极目标的瑞士军刀。
具体来说,Docker在开发和运维的过程中,具有以下几个方面的优势。
- 更快速的交付和部署。
使用Docker,开发人员可以使用镜像来快速构建一套标准的开发环境;比如在项目开发过程中我们先会用Docker将代码部署到本地进行测试验证。使用Docker在本地轻松搭建出的和服务器类似的架构,在开发环境中测试更贴近于生产环境。开发完成之后,测试和运维人员可以直接使用相同环境来部署代码。Docker可以快速创建和删除容器,实现快速迭代,大量节约开发、测试、部署的时间。并且,各个步骤都有明确的配置和操作,整个过程全程可见,使团队更容易理解应用的创建和工作过程。
- 更高效的资源利用。
Docker容器的运行不需要额外的虚拟化管理程序支持,它是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。
- 更轻松的迁移和扩展。
Docker容器几乎可以在任意平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。利用这种兼容性让用户可以在不同平台之间轻松的迁移应用。
- 更简单的更新管理。
使用Dockerfile,只需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式进行分发和更新,从而实现自动化并且高效的容器管理。
00x3 Docker与虚拟机实现原理比较。
下图分别是Docker与虚拟机的实现框架:
比较这两个图的差异,可以看到虚拟机的Guest OS层在Docker中被Docker Engine层所替代。虚拟机的Guest OS即为虚拟机安装的操作系统,它是一个完整的操作系统内核;虚拟机中的Hypervisor层可以简单的理解为一个硬件虚拟化平台,它在Host OS是以内核态的驱动存在的。
虚拟机实现资源隔离的方法是利用独立的OS,并利用Hypervisor虚拟化CPU、内存、IO设备等实现的。对于虚拟机实现资源和环境隔离的方案,Docker就显得很简练。Docker Engine可以简单的看成对Linux的NameSpace、Cgroup、镜像管理文件系统操作的封装。Docker并没有和虚拟机一样利用一个完全独立的Guest OS实现环境隔离,而是利用目前Linux内核本身支持的容器方式实现资源和环境的隔离。简单地说,Docker使用NameSpace实现系统环境的隔离,利用Cgroup实现资源限制,利用镜像实现根目录环境的隔离。
Docker与虚拟机计算效率的比较 :
图中从左往右分别是物理机、Docker和虚拟机的计算能力数据。可见Docker相对于物理机的计算能力几乎没有损耗,而虚拟机对物理机则有着非常明显的损耗。
为什么有这么大的性能损耗?一方面是因为虚拟机增加了一层虚拟硬件层,运行在虚拟机上的应用程序在进行数值计算时是运行在Hypervisor虚拟的CPU上,另一方面是由于计算程序本身的特性导致的差异。虚拟机虚拟的CPU架构不同于实际的CPU架构,数值计算程序一般针对特定的CPU架构有一定的优化措施,虚拟化使这些措施作废,甚至起到了反效果。
Docker与虚拟机内存访问效率比较 :
可见在应用程序内存访问上,虚拟机的应用程序要进行两次的虚拟内存到物理内存的映射,读写内存的代价比Docker的应用程序高。
Docker与虚拟机启动时间及资源耗费比较
上面主要从运行在Docker和虚拟机里的程序进行的性能比较。事实上,Docker之所以如此受到开发者关注的另一个重要原因是启动Docker的系统代价比启动一台虚拟机的代价要低得多:无论从启动时间还是启动资源耗费的角度来说。Docker直接利用宿主机的系统内核,避免了虚拟机启动时所需的系统引导时间和操作系统运行的资源消耗。利用Docker能在几秒钟之内启动大量的容器,这是虚拟机无法办法的。快速启动、低系统资源消耗的优点使Docker在弹性云平台和自动运维系统方面有着很好的应用前景。
00x4 Docker的劣势
- 资源隔离方面不如虚拟机,Docker是利用Cgroup实现资源限制的,只能限制资源消耗的最大值,而不能隔绝其他程序占用自己的资源。
- 安全性问题。Docker目前并不能分辨具体执行指令的用户,只要一个用户拥有执行Docker的权限,那么他就可以对Docker的容器进行所有的操作,不管该容器是否是由该用户创建的。
- Docker目前还在版本的快速更新中,细节功能调整比较大。一些核心模块依赖高版本内核,存在版本兼容问题。
关于Docker与虚拟机的比较详细可见:传送门