浅析Docker容器的应用场景
过去几年开源界以OpenStack为代表的云计算持续火了好久,这两年突然又冒出一个叫Docker的容器技术,其发展之迅猛远超预料。
网上介绍Docker容器的文章已经很多了,用一句话概括:Docker是一种轻量虚拟化的容器技术,提供类似虚拟机的隔离功能,并使用了一种分层的联合文件系统技术管理镜像,能极大简化环境运维过程。
Docker容器云则是使用Docker技术打造的一站式容器云服务平台,即CaaS(Containers as a Service)-容器即服务;可以将它简单看作为PaaS的升级版,使用Docker容器技术的CaaS平台功能更强大,使用灵活,部署更方便。
Docker容器作为一个全新的概念虽然广受关注,但是对于如何使用Docker,将容器技术真正落地用起来,目前估计很多人还没有非常清晰的思路。写这篇文章主要目的就是根据Docker容器的特点,描述Docker容器到底能用来干什么,达到抛砖引玉的目的。
可以认为容器云是处于IaaS和PaaS之间的位置,容器编排集成度越高越像PaaS,反之越像IaaS,据此这里简单地将Docker容器的使用分两大类:主机和服务。
相比虚拟机来说,容器使用的是一系列非常轻量级的虚拟化技术,使得其启动、部署、升级跟管理进程一样迅速,用起来灵活又感觉跟虚拟机一样没什么区别,所以有些人直接使用Docker的Ubuntu等镜像创建容器,当作轻量的虚拟机来使用。
特别是现在随着系统、软件越来越多,开发测试环境越来越复杂,仅仅靠多用户共享的这种方式节省资源带来的后果就是环境完全不可控。Docker容器的出现让每个人仅仅通过一个几KB的Dockerfile文件就能构建一个自定义的系统镜像,进而启动一个完整系统容器,让人人都能成为 DevOps。
容器云主机也完全能像普通主机一样随意启动、稳定运行、关机、重启,所以在上面随意搭建博客、小网站等完全不在话下。除了常用的托管服务业务,你完全可以自定义任何用法,包括在上面使用任何云服务提供商的云硬盘、云数据库,部署各种你需要的服务。
目前Docker容器管理服务器在Windows下运行需要借助Toolbox工具,虽然微软在2014年底就计划提供Windows Server容器镜像但目前还没有发布,所以想在Docker里跑Windows系统的容器的人还需要等待,希望到时候微软能裁剪出一种轻巧的Windows基础镜像,毕竟容器本身就是一种更轻量级的系统。
如果你仅仅把Docker容器当作一个轻量的固定虚拟机用,那其实只能算是另类用法,Docker容器最重要价值在于提供一整套平台无关的标准化技术,简化服务的部署、升级、维护,只要把需要运维的各种服务打包成标准的集装箱,就可以在任何能运行Docker的环境下跑起来,达到开箱即用的效果,这个特点才是Docker容器风靡全球的根本原因。
下面重点列举几个使用Docker容器部署服务的场景。
Web应用服务是使用最广泛的一类服务,典型的架构是前端一个Tomcat + Java服务,后端MySql数据库。
前端的Java Web服务器是最适合使用Docker容器的,先将Java运行环境、web服务器直接打包成一个通用的基础Docker镜像,之后再将自定义应用代码或编译程序包加入到该基础镜像中就能产生一个新的应用镜像,最后通过Docker服务立马就能以容器的形式启动Web应用服务。
因为web应用程序一般是无状态的,随着业务访问量增减,用同样的镜像新建、销毁容器即可轻松实现伸缩(前面还需配上DNS域名或者负载均衡的服务),例如下图所示。
Docker容器的Web服务
互联网行业倡导敏捷开发,持续集成部署CI/CD便是最典型的开发模式。
使用Docker容器云平台,就能实现从代码编写完成推送到git/svn后,自动触发后端CaaS平台将代码下载、编译并构建成测试Docker镜像,再替换测试环境容器服务,自动在Jenkins或者Hudson中运行单元/集成测试,最后测试通过后,马上就能自动将新版本镜像更新到线上,完成服务升级。整个过程全自动化,一气呵成,最大程度地简化了运维成本,而且保证线上、线下环境完全一致,线上服务版本与git/svn发布分支也实现统一。
Docker的持续集成持续部署流程
如果说上面两种应用场景还不足以体现出与传统的PaaS平台相比的巨大优势的话,那么对微服务的架构这种复杂又灵活的使用场景的无缝支持绝对具有革命意义。
微服务架构将传统分布式服务继续拆分解耦,形成一些更小服务模块,服务模块之间独立部署升级,这些特性与容器的轻量、高效部署不谋而合。
如下图所示,每个容器里可以使用完全不同环境的镜像服务,容器启动即产生了一个独立的微服务主机节点(独立的网络IP),上层服务与下层服务之间服务发现通过环境变量注入、配置文件挂载等多种方式灵活解决,而且还可以直接将云平台提供的各种云服务与自定义的微服务整合组成一个强大的服务集群。
更重要的是,拥有如此多服务的集群环境迁移、复制也非常轻松,只需选择好各服务对应的Docker服务镜像、配置好相互之间访问地址就能很快搭建出一份完全一样的新集群。
Docker容器搭建微服务架构例子
有些情况下用户只是需要执行一次性的任务,例如计算出某个结果即可,如果采用传统的服务模式,服务器需要一直运行,造成的极大的资源浪费。而容器的快速创建、销毁能很灵活满足这种完全按需付费的场景。只要制作好一次性程序运行的Docker镜像,当需要运行的时候实时通过镜像创建出容器来执行任务,程序执行完成容器自动退出释放资源。
当然,容器本身只包含静态的镜像和上层的临时可读写层,运行的数据是不会持久化的,所以任务相关数据可以从云存储、云硬盘或者云端数据库里读写。
在信息化的今天,除了计算机领域,自然科学等领域也越来越需要借助一些复杂的程序软件来做计算分析,如果还要求他们学习繁杂的服务运维部署就太麻烦了,国外就有科研人员用Docker自行部署IPython Notebook服务器开展数据科学研究的例子。
腾讯曾宣称他们已经将Docker容器用在游戏服务端使用Docker,因为对游戏不了解,具体怎么用的没太关注,有需要的人可以参考下他们的使用思路。
本文转自 网易云公众号