docker_practice/compose/rails.md
2019-03-08 12:21:07 +08:00

110 lines
3.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 使用 Rails
> 本小节内容适合 `Ruby` 开发人员阅读
我们现在将使用 `Compose` 配置并运行一个 `Rails/PostgreSQL` 应用
在一切工作开始前需要先设置好三个必要的文件
首先因为应用将要运行在一个满足所有环境依赖的 Docker 容器里面那么我们可以通过编辑 `Dockerfile` 文件来指定 Docker 容器要安装内容内容如下
```dockerfile
FROM ruby
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
RUN bundle install
ADD . /myapp
```
以上内容指定应用将使用安装了 RubyBundler 以及其依赖件的镜像更多关于如何编写 Dockerfile 文件的信息可以查看 [镜像创建](../image/create.md#利用 Dockerfile 来创建镜像) [Dockerfile 使用](../dockerfile/README.md)
下一步我们需要一个引导加载 Rails 的文件 `Gemfile` 等一会儿它还会被 `rails new` 命令覆盖重写
```bash
source 'https://rubygems.org'
gem 'rails', '4.0.2'
```
最后`docker-compose.yml` 文件才是最神奇的地方 `docker-compose.yml` 文件将把所有的东西关联起来它描述了应用的构成一个 web 服务和一个数据库每个镜像的来源数据库运行在使用预定义的 PostgreSQL 镜像web 应用侧将从本地目录创建镜像之间的连接以及服务开放的端口
```yaml
version: "3"
services:
db:
image: postgres
ports:
- "5432"
web:
build: .
command: bundle exec rackup -p 3000
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- db
```
所有文件就绪后我们就可以通过使用 `docker-compose run` 命令生成应用的骨架了
```bash
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
```
`Compose` 会先使用 `Dockerfile` web 服务创建一个镜像接着使用这个镜像在容器里运行 `rails new ` 和它之后的命令一旦这个命令运行完后应该就可以看一个崭新的应用已经生成了
```bash
$ ls
Dockerfile app docker-compose.yml tmp
Gemfile bin lib vendor
Gemfile.lock condocker-compose log
README.rdoc condocker-compose.ru public
Rakefile db test
```
在新的 `Gemfile` 文件去掉加载 `therubyracer` 的行的注释这样我们便可以使用 Javascript 运行环境
```bash
gem 'therubyracer', platforms: :ruby
```
现在我们已经有一个新的 `Gemfile` 文件需要再重新创建镜像这个会步骤会改变 Dockerfile 文件本身所以需要重建一次
```bash
$ docker-compose build
```
应用现在就可以启动了但配置还未完成Rails 默认读取的数据库目标是 `localhost` 我们需要手动指定容器的 `db` 同样的还需要把用户名修改成和 postgres 镜像预定的一致
打开最新生成的 `database.yml` 文件用以下内容替换
```bash
development: &default
adapter: postgresql
encoding: unicode
database: postgres
pool: 5
username: postgres
password:
host: db
test:
<<: *default
database: myapp_test
```
现在就可以启动应用了
```bash
$ docker-compose up
```
如果一切正常你应该可以看到 PostgreSQL 的输出几秒后可以看到这样的重复信息
```bash
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.0.0 (2013-11-22) [x86_64-linux-gnu]
myapp_web_1 | [2014-01-17 17:16:29] INFO WEBrick::HTTPServer#start: pid=1 port=3000
```
最后 我们需要做的是创建数据库打开另一个终端运行
```bash
$ docker-compose run web rake db:create
```
这个 web 应用已经开始在你的 docker 守护进程里面监听着 3000 端口了
![](../_images/docker-compose-rails-screenshot.png)