本快速入门指南介绍如何使用docker compose配置和运行一个Rails/PostgreSQL app。
定义项目
定义用来构建app的三个文件。首先由于app是运行在包含它的所有依赖的容器内,你需要定义哪些文件需要包括在容器内。这个可以使用Dockerfile来完成。这个Dockerfile包括:
- FROM ruby:2.3.3
- RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
- RUN mkdir /myapp
- WORKDIR /myapp
- ADD Gemfile /myapp/Gemfile
- ADD Gemfile.lock /myapp/Gemfile.lock
- RUN bundle install
- ADD . /myapp
上面把应用程序代码放到了镜像内,这个镜像将用来运行一个包含Ruby,Bundler和其所有的依赖的容器。
下一步,创建一个只加载Rails的bootstrap Gemfile文件。在后面将由rails new覆盖它。
- source 'https://rubygems.org'
- gem 'rails', '5.0.0.1'
需要一个空的Gemfile.lock文件,构建Dockerfile用到。
最后,开始创建docker-compose.yml文件。这个文件描述了你的app由什么服务构建(数据库和web app),如何获取每一个的镜像以及需要链接它们到一起和暴露web app的端口的配置。
- version: '2'
- services:
- db:
- image: postgres
- web:
- build: .
- command: bundle exec rails s -p 3000 -b '0.0.0.0'
- volumes:
- - .:/myapp
- ports:
- - "3000:3000"
- depends_on:
- - db
构建项目
准备好那三个文件后,就可以使用docker-compose run来生成Rails skeleton app了:
- docker-compose run web rails new . --force --database=postgresql --skip-bundle
首先,compose使用Dockerfile构建web服务的镜像。然后使用那个镜像生成容器,在容器内运行rails new命令。一旦完成,将生成一个全新的app:
- $ ls -l
- total 56
- -rw-r--r-- 1 user staff 215 Feb 13 23:33 Dockerfile
- -rw-r--r-- 1 user staff 1480 Feb 13 23:43 Gemfile
- -rw-r--r-- 1 user staff 2535 Feb 13 23:43 Gemfile.lock
- -rw-r--r-- 1 root root 478 Feb 13 23:43 README.rdoc
- -rw-r--r-- 1 root root 249 Feb 13 23:43 Rakefile
- drwxr-xr-x 8 root root 272 Feb 13 23:43 app
- drwxr-xr-x 6 root root 204 Feb 13 23:43 bin
- drwxr-xr-x 11 root root 374 Feb 13 23:43 config
- -rw-r--r-- 1 root root 153 Feb 13 23:43 config.ru
- drwxr-xr-x 3 root root 102 Feb 13 23:43 db
- -rw-r--r-- 1 user staff 161 Feb 13 23:35 docker-compose.yml
- drwxr-xr-x 4 root root 136 Feb 13 23:43 lib
- drwxr-xr-x 3 root root 102 Feb 13 23:43 log
- drwxr-xr-x 7 root root 238 Feb 13 23:43 public
- drwxr-xr-x 9 root root 306 Feb 13 23:43 test
- drwxr-xr-x 3 root root 102 Feb 13 23:43 tmp
- drwxr-xr-x 3 root root 102 Feb 13 23:43 vendor
如果这个时候或之后编辑了Gemfile,需要重新构建镜像。
连接数据库
使用如何内容替换config/database.yml文件:
- development: &default
- adapter: postgresql
- encoding: unicode
- database: myapp_development
- pool: 5
- username: postgres
- password:
- host: db
-
- test:
- <<: *default
- database: myapp_test
开始启动app:
如果一切正常,将会看到PostgrepSQL的输出,然后再过几秒钟,将看到
- myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick 1.3.1
- myapp_web_1 | [2014-01-17 17:16:29] INFO ruby 2.2.0 (2014-12-25) [x86_64-linux-gnu]
- myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
最后,在另一个终端创建一个数据库:
- docker-compose run web rails db:create
现在app已经运行在主机的3000端口。