DockerでRails + MySQLアプリを立ち上げる手順メモ


前回Docker上でRailsアプリを立ち上げるところまでやってMySQL無いからエラー出るという所で終わっていましたが、今回はRailsコンテナとMySQLコンテナを関連付けて立ち上げてみたいと思います。





<h1>使用するimage</h1>

docker pullで落とすなりしてください
`takashioshikawa/ruby-native-2.2.4`
`mysql:latest`




<h1>MySQLコンテナ立ち上げ</h1>

mysql-containerという名前のコンテナを立ち上げます
`docker run --name mysql-container -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql`

オプション解説
`-d` : バックグラウンドで起動
`--name mysql-container ` : コンテナに名前を付ける
`-p 3306:3306` : ポート指定 「外部から指定するポート:MySQLコンテナ内のポート」
`-e MYSQL_ROOT_PASSWORD=root ` : 環境変数にMySQLのパスワードを指定




<h1>Railsコンテナ立ち上げ</h1>

rails-containerという名前のコンテナを立ち上げます
`docker run --rm -it -p 9000:80 --name rails-container --link mysql-container:mysql-container takashioshikawa/ruby-native-2.2.4`

オプション解説
`--rm` : コンテナを終了させた時に削除する
`-it` : コンテナにコマンドを入力出来るようにする
`-p 9000:80` : ポート指定 「外部から指定するポート:内部ポート」
`--name rails-container` : コンテナに名前をつける
`--link mysql-container:mysql-container` : 外部のコンテナとの関連付け



<h1>Railsコンテナ内でアプリ作成</h1>

前回の内容と似てますが作成していきましょう。

まずはRailsアプリを作成するディレクトリ作成
`mkdir /usr/src/rails-app`
`cd /usr/src/rails-app`

rails-container内にMySQLがないとrails newで怒られるのでMySQLインストール
`yum install -y mysql-devel`

Gemfile作成
`bundle init`

Gemfile編集

```Gemfile
source "https://rubygems.org"
gem "rails", "4.2.5"
```

bundleインストール
`bundle install`

Railsアプリ作成(MySQLが無いとここで怒られます)
`bundle exec rails new rails-test -d mysql`

`cd rails-test`

Gemfile編集

```Gemfile
#ここがコメントアウトされてるので外す その他は最初と同じ
#gem 'therubyracer', platforms: :ruby

gem 'therubyracer', platforms: :ruby

```

database.yml編集
`vim config/database.yml`

```database.yml
development:
  <<: *default
  database: rails-test_development
  url: mysql2://root:root@mysql-container:3306
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  host:     <%= ENV['DB_PORT_3306_TCP_ADDR'] %>
  port:     <%= ENV['DB_PORT_3306_TCP_PORT'] %>

test:
  <<: *default
  database: rails-test_test
  url: mysql2://root:root@mysql-container:3306
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  host:     <%= ENV['DB_PORT_3306_TCP_ADDR'] %>
  port:     <%= ENV['DB_PORT_3306_TCP_PORT'] %>
```

今回はdevelopmentとrake用にtestのurl, password, host, portを指定しています
urlで指定している
`mysql2://root:root@mysql-container:3306`
は
`ユーザ:パスワード@コンテナ名:ポート`
という形式
パスワードはMySQLコンテナ立ち上げるときに指定したやつ

bundleインストール
`bundle install`

DB作成
`bundle exec rake db:create`

必要なファイル生成
`bundle exec rails g scaffold User name:string`

DBマイグレート
`bundle exec rake db:migrate`

Rails実行
`bundle exec rails s -b 0.0.0.0 -p 80`

`-b 0.0.0.0` : Railsコンテナ内でのアドレス(0.0.0.0は最初から外と繋がる)
`-p 80` : ポート指定



<h1>ブラウザで確認</h1>

現在dockerのrailsアプリが立ち上がっていると思うのでMacのChromeから見てみましょう

アクセスするURLは
`http://docker-machineのIP:rails-containerのポート`
docker-machineのIPを確認したい場合は
`docker-machine ip VM名`
で確認できる

僕の場合
http://192.168.99.100:9000
だった

![スクリーンショット 2016-01-16 22.19.33.png](https://qiita-image-store.s3.amazonaws.com/0/36871/2fdef390-b00e-a6cf-cf8c-bf90c97a0e7b.png "スクリーンショット 2016-01-16 22.19.33.png")


Scaffoldで作成したUserにアクセスしてみる
http://192.168.99.100:9000/users

![スクリーンショット 2016-01-16 22.16.15.png](https://qiita-image-store.s3.amazonaws.com/0/36871/29e852e5-cc7a-be3a-6246-8d32c16badf8.png "スクリーンショット 2016-01-16 22.16.15.png")

出来てるっぽい


<h1>所感</h1>
dockerは1つのコンテナを素早く立ち上げたり消したりするのはかなり楽でいいけど、コンテナ間の連携しようとすると結構面倒くさい…
今回引っかかったのは--linkでどう繋がるのかイメージが付きにくかったのと、database.ymlにmysql-containerのurl載せないとrails sでMySQL無いぞと怒られ続けたのがツラかった :crying_cat_face: 

docker composeキメれば後々気にしなくてもいいらしいのでそこも早く学びたい

今回はコンテナ内でrailsアプリから作成しているので実行環境だけを作りたい場合はDockerfileで必要なGemやmysqlが入るようにしてimageにしないといけないのでそこもやっておきたい

以上です。

参考
[複雑な構成のrailsアプリをdockerで動かしたい場合はどうするべきか](http://qiita.com/k-shogo/items/3c887cbf86b3cab85b72 "複雑な構成のrailsアプリをdockerで動かしたい場合はどうするべきか")
[Dockerの公式MySQLイメージの使い方を徹底的に解説するよ](http://dqn.sakusakutto.jp/2015/10/docker_mysqld_tutorial.html "Dockerの公式MySQLイメージの使い方を徹底的に解説するよ")