Docker Overview

在我的这篇文章Docker and Microservices - Hands On里,根据官方提供的教程,我成功地基于Docker部署了两个Service应用在AWS上,这篇文章尝试从一个大的视角来介绍Docker。从哪些维度出发去认识一个新的概念,在这篇文章认识新事物的维度我表达了自己的观点。

What is Docker

Docker 官方给出的定义是:

Docker is the company driving the container movement and the only container platform provider to address every application across the hybrid cloud.
Today’s businesses are under pressure to digitally transform but are constrained by existing applications and infrastructure while rationalizing an increasingly diverse portfolio of clouds, datacenters and application architectures. Docker enables true independence between applications and infrastructure and developers and IT ops to unlock their potential and creates a model for better collaboration and innovation.

Docker是一家容器平台提供商。这个定义一目了然:Docker是一家公司,它提供的产品是“Container Platform”。那什么是Container Platform呢,我们把它拆分成ContainerPlatform来解释。

Container

我们先看官方的解释:

A container is a runtime instance of an image—what the image becomes in memory when actually executed. It runs completely isolated from the host environment by default, only accessing host files and ports if configured to do so.

这个解释也很简单:Container是Image的运行时实例。“Instance”这个概念在软件世界里很常见,比如在OO里,我们说对象(Object)是类(Class)的实例(Instance);在Web Service里,oData是RESTful API的实例。在解释Image之前,我们暂且先把Image理解成一个Application,其架构图如下:

Docker Overview_第1张图片
Container Diagram

从上图我们可以知道:在一台服务器主机上装了操作系统(OS)来控制硬件并提供硬件访问接口,然后在这个OS里装了Docker之后,所有的Container就可以在Docker上面执行了。所以 Docker可以理解成Container的OS。这里我们可以把Container看作是JAVA世界里的一个JAR文件,当我们写好自己的JAVA应用后我们会将其打包成JAR文件,里头包含了配置文件,引用的外部库等一系列信息,然后JVM就可以执行这个JAR文件了。所以我们说:JAR是运行在JVM上的。同样的,Container是运行在Docker上。

Image并不仅仅是一个Application,其官方解释:

An image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the code, a runtime, libraries, environment variables, and config files.

即Image是一个可执行的文件包(Package),它里面包括了执行一个软件需要的所有东西:源代码,运行时,库文件,环境变量,配置文件。
那么谁来执行Image这个Package呢?答案是Docker Engine了。就像exe文件由Windows系统来执行,dmg文件由Mac OS X执行一样。
我们可以看下面两张图:


Docker Overview_第2张图片
Docker Image (1/2)

Docker Overview_第3张图片
Docker Image (2/2)

从上述两张图中我们可以得到一个重要信息,即:Docker的架构是“Client-Server”型架构。

What can Docker do

第一部分很枯燥,因为一直在解释各种概念和定义,跟现实世界没有任何的联系。这部分尝试从现实角度来介绍Docker。

The World W/O Docker

在Docker出现之前,一个网络应用程序是如何部署在生产环境并维护的呢?这是一个很大的话题,我的经验和水平还不够系统科学地去解释这个问题,但是我想以一个在线购物网站为例来解释其可能碰到的问题(真实情况下,在线购物网站其功能和架构远比我下面所描述地要复杂得多)。

非常粗糙地讲,一个在线购物网站应该包括数据存储,核心应用逻辑(如用户注册,下订单,支付),交互页面等模块。

最最最理想的情况下,如果第一次上线的产品能够实现所有的功能,后期不会再加入任何新的功能,并且其吞吐量无限大,支持任意数量的用户的同时访问和交互,数据存储能力和检索能力也能够无限大。当然这是绝对绝对不可能的!!!产品的迭代升级和更新,对系统吞吐量和数据读写速度的要求,网络带宽等是软件工程中最核心的几个问题之一。

当前该在线购物网站的支付方式只支持信用卡支付,随着业务的发展,公司认为应该同时支持信用卡支付和支付宝支付。
对于这一需求,第一步当然是在开发系统中新增支付宝支付的相关模块并集成到原先的支付模块中并完成测试。我们假设这个功能开发工程师已经高质量地完成而且QA也签字通过,那么如何上线到生产环境呢。

  • 第一个方案:将新的项目包部署到生产系统服务器上,并代替旧的项目包,重新启动服务器
    升级过程虽然简单且易操作,但在升级期间该网站将会全部瘫痪,而且此时如果有用户正在下订单或者支付订单,那么他的这一操作将会被中断而且不可恢复,甚至会造成严重的数据不一致,如用户已通过信用卡完成付款,系统正在更新订单状态为“已支付”时服务器却无法访问了。当然,可以通过类似于缓存备份和日志文件等信息,在系统升级完成之后再来更新相应的订单,且不说这种事后处理机制能否保持绝对的正确性和零遗漏,其本身所造成的信息滞后和巨大的维护升级成本,对于购物平台来说是非常难以接受的;而且在系统越来越庞大的时候,这种滞后和其所带来的成本也会越来越大。

  • 第二个方案: 将用户登陆模块,下订单模块部署在核心入口服务器上,支付模块等功能分开部署在不同的服务器上,“支持支付宝支付”这一功能只会影响到支付模块所在的服务器
    相比于第一个方案,用户可以正常登陆网站并下订单,只是不能完成支付,此时系统的可访问性得到了极大地提高。但是因为支付模块部署在独立的服务器上,所以需要增加新的中间件组件将请求派发到相应的服务器上,这会增加额外的网络访问时间,而且引入了新的问题,即如何确保支付模块功能与订单状态更新功能之间的一致性问题(消息队列事务型消息队列等可以解决这一问题,我的这篇文章消息中间件使用场景有具体的介绍。此时,对于正在进行的支付消息,可以在支付队列中根据其状态来很好地管理决定补救措施。对于新进来的消息队列,可以有相应的策略来管理,比如直接拒绝其进入消息队列)。

The World W/ Docker

我们前面介绍了软件升级和新功能交付上线时所可能面临的问题,而且我举的例子只是冰山一角,可见其复杂性和由此带来的巨大的成本。对于如何解决这一问题有一个特定的软件工程实践叫DevOps,其是在传统的开发,测试,运维的基础上增加的新角色:

Docker Overview_第4张图片
DevOps
这个定义很好地解释了DevOps:

DevOps is a set of practices intended to reduce the time between committing a change to a system and the change being placed into normal production, while ensuring high quality.[9]
-- From WikiPedia

基于DevOps这个角度,Docker可以认为是:

Docker is a tool that is designed to benefit both developers and system administrators, making it a part of many DevOps (developers + operations) toolchains.For developers, it means that they can focus on writing code without worrying about the system that it will ultimately be running on. It also allows them to get a head start by using one of thousands of programs already designed to run in a Docker container as a part of their application. For operations staff, Docker gives flexibility and potentially reduces the number of systems needed because of its small footprint and lower overhead.
-- From here

Summary

使用Docker,软件工程师只需将自己的项目代码Docker化(Dockerize)并打包成Docker Image,然后交由Docker来管理项目的部署和新功能的交付。而且,Docker提供了一系列的工具来帮助开发人员监控和管理项目的状态。此外,Docker还支持同AWS, Azure等Cloud Provider的集成,即部署在这些平台的应用也可以使用Docker来托管。Docker(Container Platform)是通过提供一系列工具完成项目部署并保证高质量的持续交付的最佳实践之一。
当然,Container这一概念有很多优势,但是它绝对不是Silver Bullet, 关于其具体的优缺点,这篇博客讲得很详细.

你可能感兴趣的:(Docker Overview)