## 在基础架构中部署Docker
#### 将容器与虚拟机结合
容器和虚拟机都能在一个共享主机上为运行的应用程序提供隔离环境,只是来自不同的技术视角而且可以基于应用程序环境的需要很好地独立使用或者结合在一起。
虚拟机使用一个完整的OS,包括它自己的内存管理和虚拟设备驱动程序。隔离是在虚拟机层面提供的,因为资源是为客户OS(guestOS)仿真而来的,因此允许在单一主机上运行一个或多个并行(而且甚至是不同的)OS。虚拟机提供了应用程序进程和逻辑系统之间的边界。Hypervisor会拒绝虚拟机执行可能会危害主机平台完整性的指令。对主机的保护有赖于提供一个安全的虚拟硬件环境来运行一个OS。这个架构对于主机资源利用率有不同的影响,但是允许在单一主机上通过不同的OS运行应用程序。
Docker容器在相同主机上运行的所有应用程序容器之间共享一个单独的主机OS。隔离是由Docker Engine在每一个应用程序层面上提供的。使用容器降低了每个应用程序的开销因为避免了多个OS实例。这使得容器更加轻量、快速且易于扩展和收缩,并且可以实现比完整的虚拟机更高的密度等级。这种方式只能对共享一个通用OS的应用程序有效,就像Linux用于分布式应用程序一样。
虚拟机的常规方式不允许他们能真正缩小到只运行一个单独应用程序服务的级别。一个虚拟机可以支持一个相对丰富的应用程序集,但是在单一虚拟机内运行多个微服务而不使用容器则会带来问题因为对于有些组织而言每个虚拟机只运行一个微服务在经济上是不可行的。与虚拟机相结合地部署Docker容器能够实现整个服务组中的服务彼此隔离而且运行在一个虚拟机中。这种方式通过引入两个层级:容器与虚拟机,而提升了分布式应用程序的安全。另外这种方式达成了更有效的资源使用并且可以为所定义的隔离和安全目标在减少虚拟机数量的同时增加容器的密度。
[![](https://box.kancloud.cn/2015-11-11_5642a26851d69.png)](http://dockerone.com/uploads/article/20151109/08e76d21407ce7d4a6db2a65cc0e9631.png)
因此可以通过把虚拟化和容器相结合所提供的隔离比单独使用虚拟化在成本和资源效率上更好。Docker容器与可以保护虚拟机自身的虚拟化技术能够完备搭配,并且为主机提供深度防御。
#### 在裸机上运行Docker
容器在主机及其应用程序之间提供了一层保护,在应用程序和主机之间提供了隔离。相比于不使用任何虚拟化或者容器技术,这使得它在逻辑上部署应用程序会更加安全。借助容器,很多应用程序服务可以部署在单一主机上从而使得组织能够实现对其基础架构更好的利用率。
然而,裸机部署不能提供最底层的硬件隔离,故而它不能充分发挥Intel的VT-d和VT-x技术的优势。在这个情境下,对于主机隔离的等级而言容器不能完全替代虚拟化。
[![](https://box.kancloud.cn/2015-11-11_5642a268621ba.png)](http://dockerone.com/uploads/article/20151109/bbb3ca661f0c47147e76175768770897.png)
容器为运行在裸机之上的应用程序提供了隔离,它保护了主机去应对大量的威胁而且能够满足非常广泛的使用场景需求。在以下的场景中虚拟机可能不是最好的选择而容器则可以取而代之;性能至上的应用程序运行在一个单租户的私有云中,跨租户或跨应用程序的攻击并不是一个值得关注的问题;或者他们正在使用不能直接映射给虚拟机的专用硬件,或者该硬件提供直接内存访问而使得虚拟化的优势无法发挥。很多GPU运算的用户就面对着这个问题。
运行在裸机之上的Docker容器与他们运行在虚拟机上时拥有相同的高级别限制。无论那种场景,一个容器通常都被允许修改物理的或虚拟的设备。
#### 生命周期管理
软件开发只是应用程序生命周期的一个阶段。测试、运行及管理阶段的安全需求是非常关键的,并且涉及了不同的团队、工具和流程。无论计划内或者计划外的持续运维和更新都需要保持操作运行的安全和平稳。更新应用程序部件的过程往往不是小事儿甚至更严重,即使有补丁自动发布工具也会很繁琐。此时的问题是安装的补丁是否影响了其他的东西?安装这个补丁有多难?如果更新失败要如何完全地回滚?构建映像的便利性应该延展到对这些映像的更新并且安装安全更新。运维工程师可以利用映像标签来以一种自动的方式来安全地、容易地安装计划内的安全更新并为之前的版本安装更新。计划外的补丁和修复程序也可以通过提交、更新和重新发布容器映像的方式安装。更新的映像可以推送到Docker Hub或任何其他的注册机以便于同其他团队进行分享和发布。
Docker容器的这些特点使得系统管理员在更新系统工具、软件包甚至是主机的内核都很容易。OS的升级周期被明显地缩短而且也容易实现,显著地降低了基础架构在攻击面前的总体暴露面。相比于虚拟化模型中每个主机有多个OS需要维护,Docker环境中每个主机只有一个OS需要维护。需要打补丁和更新的OS实例数量减少将降低与安全合规相关的开销。
确保安全合规性等同于应用最新的更新并保持对系统包含什么及其变更历史进行跟踪。对生产环境中容器的变更历史能够进行审计可以验证对生产系统没有进行有危害的变更,而且当问题出现时也有能力把容器回滚到一个已知的正常状态下。总之,使用分层手段使得参照公开常见风险和漏洞列表(CVE)来检查OS包和应用程序依赖性变得更加容易。
#### 总结
基于微服务的架构为应用程序在整个生命周期内如何开发、部署及管理提出了不同的需求而且打包工具的变化及安全模型也要能够支持它。安全需求可以采取分层的方式来满足,它以应用程序栈来对待整个基础架构而且通常会综合多种技术来保证满足每一层的安全需求等级。
Docker在组织使得深度防御概念的部署简单化了。使用Docker可以立即带来有益,不仅仅是在应用程序开发和部署的速度和便利性方面,也表现在安全方面。通过隔离、约束及隐形地应用了大量的最佳实践–否则需要在组织内的每个OS上进行明确的配置,直接部署Docker自然就会提升系统的整体安全等级。
总而言之,企业使用了Docker容器可以在不增加应用程序基础架构开销的前提下增强安全:
* 容器通过在应用程序与主机之间以及在应用程序之间进行隔离而不需要使用更多的底层基础架构资源和降低主机的暴露区域来提供了更多一层的保护。
* 容器和虚拟机可以部署在一起来为所选择的服务提供更多的隔离和安全层级。
* 容器的性质有利于快速、便捷的应用程序打补丁以及OS更新,应用程序及基础架构的分层,有助于维持整体的安全合规性。
原文链接:[Introduction to Container Security](https://d3oypxn00j2a10.cloudfront.net/assets/img/Docker%20Security/WP_Intro_to_container_security_03.20.2015.pdf)(翻译:李毅)