使用Compose部署Rails应用

本次快速教程将展示怎样使用Compose来安装和运行 Rails/PostgreSQL应用,在开始之前,你需要了解Compose installed。

定义项目

开始设定三个应用需要构建的文件。首先,当你应用将运行在一个Docker容器(包含所有它的依赖项)时,你将需要额外定义在容器中。这些,我们都使用Dockerfile来完成。开始,Docker包含内容:

  1. FROM ruby:2.2.0
  2. RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
  3. RUN mkdir /myapp
  4. WORKDIR /myapp
  5. ADD Gemfile/myapp/Gemfile
  6. RUN bundle install
  7. ADD . /myapp

放置你的应用代码在构建有Ruby,Bundler和所有依赖项的镜像里边。了解更多书写Dockerfile的内容,查看 Docker user guide和Dockerfile reference。

接下来,创建一个Bootstrap的Gemfile文件。它将被rails new重写。

  1. source 'https://rubygems.org'
  2. gem 'rails','4.2.0'

最后,docker-compose.yml让所有逻辑生效。这个文件描述了包含你应用的所有服务,Docker镜像怎样获得每一个服务的,以及配置需要彼此链接在一起的,暴露的web应用端口。

  1. db:
  2. image: postgres
  3. ports:
  4. - "5432"
  5. web:
  6. build: .
  7. command: bundle exec rails s -p 3000-b '0.0.0.0'
  8. volumes:
  9. - . : /myapp
  10. ports:
  11. -"3000:3000"
  12. links:
  13. - db

构建项目

这三个文件就位,你现在可以生成Rails框架应用,使用docker-compose run命令:

  1. $ docker-compose run web rails new . --force --database=postgresql --skip-bundle

首先,Compose将构建包含web服务的镜像。然后,它将运行rails new在新的容器中。一旦完成,你应该生成一个崭新的应用。

  1. $ ls
  2. Dockerfile app docker-compose.yml tmp
  3. Gemfile bin lib vendor
  4. Gemfile.lock config log
  5. README.rdoc config.rupublic
  6. Rakefile db test

取消注释行,在你的新Gemfile将加载therubyracer,因此你获得一个JS运行时:

  1. gem 'therubyracer', platforms::ruby

现在,你获得一个新的Gemfile,你需要重新构建一次镜像。

  1. $ docker-compose build

连接数据库

app现在是可引导的,但是你现在不会很安静。默认情况下,Rails期望一个数据库运行在localhost,因此你需要将它指向db容器里边。你也需要修改数据库和用户名,来与postgres镜像的默认设置联系起来。

打开新生成的database.yml文件。替换它的内容如下:

  1. development:&default
  2. adapter: postgresql
  3. encoding: unicode
  4. database: postgres
  5. pool:5
  6. username: postgres
  7. password:
  8. host: db
  9. test:
  10. <<:*default
  11. database: myapp_test

你现在可以重启app

  1. $ docker-compose up

如果完成,你需要看某些PostgreSQL 输出,然后隔几秒看到相似的输出:

  1. myapp_web_1 |[2014-01-1717:16:29] INFO WEBrick1.3.1
  2. myapp_web_1 |[2014-01-1717:16:29] INFO ruby 2.2.0(2014-12-25)[x86_64-linux-gnu]
  3. myapp_web_1 |[2014-01-1717:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000

最后,你需要创建数据库。在其它终端,运行:

  1. $ docker-compose run web rake db:create

你的应用现在被运行在端口3000,在你的Docker daemon上(如果你使用Boot2docker,boot2docker ip将告诉你它的地址)。

更多Compose文档

Installing Compose

User guide

Command line reference

Yaml file reference

Compose environment variables

Compose command line completion