【编者的话】 “十二要素应用”为开发SaaS应用提供了方法上的指导,而Docker能够提供打包依赖,解耦后端服务等特性,使得两者非常吻合。这篇文章介绍了Docker特性怎样满足了开发“十二要素应用”的对应要点。
Docker非常适合开发“十二要素应用”。
“十二要素应用”为构建SaaS应用提供了方法论,是由知名PaaS云计算平台Heroku的创始人Adam Wiggins提出的。请参考这篇 文章 。
Dockerfile与docker-compose.yml正在成为用代码定义服务的标准,通过它们可以定义服务的所有内容:依赖,环境,端口,各种进程以及后端服务。
Docker镜像和容器为操作系统提供了保证,使得开发环境和生产环境可以有效地保持一致。
这篇文章简单地介绍了Docker是怎样满足“十二要素应用”的核心要点的。它解释了用Docker开发一个典型的“Rails/Postgres/Redis/web/worker”所应用的技术。
后续文章将通过代码深入介绍如何应用这些技术。
Docker镜像基于显示的Dockerfile构建,而Docker容器作为独立的运行环境。
Dockerfile提供了显示声明基础操作系统的方法(FROM), 而且通过运行命令来安装附加的系统包以及应用的依赖包(RUN)。
通过这些方法,你可以声明你需要ubuntu 14.04, Ruby 2.2.2, Node 0.11, 然后一次性安装。
Docker容器非常依赖Linux的环境变量进行配置。
docker-compose.yml有一个环境变量的哈希表,你可以通过它显示的定义容器的环境变量。这些默认的或者未定义的值将在运行时从主机中继承。
另外,还有Dokckerfile的ENV命令以及”docker run –env=[]”和”docker run –env-file=[]”运行选项可以设置环境变量。
通过这些方法,你可以声明你的应用需要环境变量GITHUB_AUTH_TOKEN。
Docker非常依赖端口绑定。
docker-compose.yml有一个端口阵列,可以通过它显示的定义“主机:容器”的端口绑定。“docker run –p HOST:CONTAINER”让你可以在运行时定义端口绑定。
通过这些方法,你可以声明你的应用的网络服务器将监听端口5000,而且你可以通过主机的端口5000获取服务。
Docker容器与其他容器几乎完全隔离,所以需要通过网络与后端服务进行通信。
docker-compse.yml有一个链接哈希表,你可以通过它指定你的应用所需要依赖的其他容器服务。‘docker-compose up’命令将首先开启这些后端服务,然后配置应用容器中网络连接信息的环境变量。
通过这些方法,你可以声明你的应用需要Postgres 9.4和Redis 3.0服务,让你的应用通过主机名和端口号与他们建立连接。
默认情况下,Docker容器是不带储存的进程。
docker-compose.yml定义了一系列服务,每一个服务都有自己的镜像或者构建文件(Dockerfile)以及命令。
通过这些方法,你可以声明你的应用同时有一个网络进程和工作进程。
Docker镜像可以很容易地运行一次性进程。
‘docker run myapp CMD’可以在与你的网络进程一致的环境中运行任意命令。
通过这些方法,你可以基于你的Postgres数据库运行交互式的bash或者运行一次性的’rake db:migrate’进程。
若没有Docker,OS X的开发工具链是这样的:Homebrew作为系统依赖包, Postgres和Redis作为开发服务, Ruby的Bundler作为跨平台开发依赖,一系列的Shell脚本和foreman让所有工具在本地同时运行起来,以及一个独立的基于Linux的构建服务负责将应用打包到生产环境。
这样的工作流并没有错误,但是Docker提供一个更简洁的方式。
有了Dockerfile和docker-compose.yml文件,我们将不再需要任何OS X系统依赖,服务包或者跨平台的语言依赖。一个简单的“dicker-compose up”命令可以提供一个完整的Linux开发环境,并且能够轻易地将“十二要素应用”移植到生产机器。
译者介绍:
刘凯:毕业于中国科学技术大学,目前在日本国立信息学研究所攻读云计算方向的博士学位,近期专注于Docker技术的研究。