前回Docker上でRailsアプリを立ち上げるところまでやってMySQL無いからエラー出るという所で終わっていましたが、今回はRailsコンテナとMySQLコンテナを関連付けて立ち上げてみたいと思います。
使用するimage
docker pullで落とすなりしてください
takashioshikawa/ruby-native-2.2.4
mysql:latest
MySQLコンテナ立ち上げ
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のパスワードを指定
Railsコンテナ立ち上げ
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
: 外部のコンテナとの関連付け
Railsコンテナ内でアプリ作成
前回の内容と似てますが作成していきましょう。
まずは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編集
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編集
#ここがコメントアウトされてるので外す その他は最初と同じ
#gem 'therubyracer', platforms: :ruby
gem 'therubyracer', platforms: :ruby
database.yml編集
vim config/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
: ポート指定
ブラウザで確認
現在dockerのrailsアプリが立ち上がっていると思うのでMacのChromeから見てみましょう
アクセスするURLは
http://docker-machineのIP:rails-containerのポート
docker-machineのIPを確認したい場合は
docker-machine ip VM名
で確認できる
僕の場合
http://192.168.99.100:9000
だった
Scaffoldで作成したUserにアクセスしてみる
http://192.168.99.100:9000/users
出来てるっぽい
所感
dockerは1つのコンテナを素早く立ち上げたり消したりするのはかなり楽でいいけど、コンテナ間の連携しようとすると結構面倒くさい… 今回引っかかったのは--linkでどう繋がるのかイメージが付きにくかったのと、database.ymlにmysql-containerのurl載せないとrails sでMySQL無いぞと怒られ続けたのがツラかったdocker composeキメれば後々気にしなくてもいいらしいのでそこも早く学びたい
今回はコンテナ内でrailsアプリから作成しているので実行環境だけを作りたい場合はDockerfileで必要なGemやmysqlが入るようにしてimageにしないといけないのでそこもやっておきたい
以上です。
参考
複雑な構成のrailsアプリをdockerで動かしたい場合はどうするべきか
Dockerの公式MySQLイメージの使い方を徹底的に解説するよ