一个 IT 系统大致可以分为:
- 应用程序
- 运行时平台(bin/framework/lib)
- 操作系统
- 硬件(基础设施)
开发人员的主要工作是应用程序的编码、构建、测试和发布,涉及应用程序和运行时平台这两层。而运维人员的工作则涉及从硬件、操作系统到运行时平台的安装、配置、运行监控、升级和优化等工作。
云计算最主要的价值体现在实现了自动化运维。提高资源的利用效率,是较为次要的价值。
要实现自动化运维,需要解除 IT 系统各层之间的耦合,使各层变成可编程控制,即「software defined」的。只有我们可以编程创建和控制各层对象,才能达到最大程度的运维自动化。
硬件虚拟化技术解除了硬件和操作系统的耦合,用户可以编程创建和控制虚拟机(包括虚拟硬件,运行自定义的操作系统镜像)、虚拟存储设备和虚拟网络。
操作系统虚拟化技术解除了操作系统和运行时平台的耦合,用户可以编程定义适合应用运行的平台,包括需要的二进制程序、框架和库等。操作虚拟化技术既可以用来创建和管理系统容器,也可以用来创建和管理应用容器。如果是用作系统容器,这相当于一个轻量级虚拟机,目的是解除操作系统与底层的耦合。例如, LXC/LXD 和 OpenVZ 属于这个路线的。而 Docker 容器主要是用作应用容器,包括两方面的功能:
静态打包:把应用程序及其运行时打包为一个镜像;
动态运行:以一个应用容器的形式运行这个应用。
Docker 提供的这些功能是任何一家公司开发 IT 应用时都需要用到,它的使用是轻量级的,只需安装一个 Docker 软件包,就可以用起来,例如,用作开发和测试环境的构建。单机也能用,集群也能用,既可以简单,也可以复杂,非常灵活。想想看,如果你要安装和使用 OpenStack,有没有这么轻松便捷?
Docker 本身只提供最基本的功能,如果用户需要构建一个复杂的 IT 系统,单靠 Docker 本身是不够的。幸运的是,Docker 不仅提供了 API,还形成了一个庞大的社区和生态系统,包括知名的那些 IT 巨头。因此,基于 Docker 的解决方案具有非常大的灵活性,从原理上讲,不会对你的操作系统、运行时平台有特殊的限制。我个人觉得 Docker 是符合 Unix/Linux 哲学的:只做一件事,做到最好。还能与其它程序复合(compose),完成更复杂的功能。
对最终用户而言,Docker提供的是一个标准化的交付方式。
把应用跑起来只需要两样事情:
- 一个64位的linux内核
- 一个打包正确的docker镜像地址,或者Dockerfile
这样,用户,不管是大企业还是普通想在服务端跑程序的人,只需要这2者就完了。不用去操心一堆的数据库、消息队列、中间件、jvm参数、等等等的所有麻烦的事情。
这种交付方式能给用户带来什么体验呢?
一个形象的比喻就是目前iphone手机上的APP,在用户看来,只要点击“安装”,然后在桌面上就会出现一个图标,从灰色到下载完毕。其他任何事情都不需要操心。(我已经觉得该开发一个iphone版的docker容器的形象化管理程序了)想想我们当年多么痛苦的在PC机上安装游戏或者各种软件,现在在手机和平板上已经过了这个阶段,服务端也该过这个阶段了。
在这个前提之下,这样的应用场景就会出现:
任何一个人或者组织都能从docker市场上买到服务端应用,然后一键部署在自己使用的云上面。