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里,oDataRESTful API的实例。在解释Image之前,我们暂且先把Image理解成一个Application,其架构图如下:

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 Image (1/2)

Docker Image (2/2)

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

What can Docker do

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

The World W/O Docker

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

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

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

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

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

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

The World W/ Docker

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

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, 关于其具体的优缺点,这篇博客讲得很详细.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容

  • 前段时间投入了一点精力放到了SVG动画上是因为在项目中用到了动态加载图标以及字体图标,所以顺便把这些相关的内容补了...
    泱泱悲秋阅读 1,220评论 0 4
  • 我是一个流浪汉 我孤身一人 没有房子,没有雨伞 听说明天要下雨 我不想未雨绸缪 明天的问题就交给明天的我来处理吧 ...
    六便士__阅读 95评论 0 1