【Windows】DockerでRuby on Rails開発環境構築方法

【Windows】DockerでRuby on Rails開発環境構築方法



✓目次


この記事の対象者


・ Windows10のPC(Windows10 Pro 64bit)でDockerを用いてRuby on Railsの環境を作りたい人

・ Rails version: 5.0.0.1, Ruby version: 2.4.5, MySQL 5.7系の環境構築方法を知りたい人

4つのファイル(Dockerfile, Gemfile, Gemfile.lock, docker-compose.yml)を用意する



Windows10のPCにDockerを導入し、Ruby on Rails環境を構築する大まかな流れは以下のとおりです。


  1. Docker for Windowsのインストールと再起動→再起動後、Dockerが起動しているかタスクバーのアイコンを確認
  2. PowerShellを起動しdocker run hello-worldを実行してDockerが正常に動作するかを確認
  3. 任意の場所にフォルダを作成し、以下のファイルを用意する
    • Dockerfile
    • Gemfile
    • Gemfile.lock
    • docker-compose.yml
  4. 上記4つのファイルを用いてコンテナ起動

以降は主に、3. と4. の工程を中心にまとめています。

Dockerfile


所定のフォルダに以下のようなDockerfileを用意します。


Dockerfile
1
2
3
4
5
6
7
8
9
FROM ruby:2.4.5
RUN apt-get update -qq && apt-get install -y build-essential nodejs
RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock
RUN bundle install
COPY . /app


Dockerfileには、Railsを実行するためのファイルやパッケージを、イメージに含めるための定義が書かれています。

このDockerfileがビルドされることで、Docker Imageというコンテナ仮想環境の雛形が作成されるのです。

ruby:2.4.5のコロンの前の部分を、リポジトリと言い、コロンの後ろを、タグといいます。

この場合、2.4.5のタグを書いています。

リポジトリには様々なバージョンがあります。詳細は、以下のDocker Hubを参照してみてください
https://hub.docker.com/_/ruby?tab=tags&page=1&ordering=last_updated

COPY . /appはDockerファイルの置いてあるフォルダの内容をすべてコンテナ内の/appディレクトリにコピーをしています。これは、Railsのアプリケーション実行に必要なファイルを、全てコンテナの中に含めるために記載しています。そのため、余計なファイルを含めてしまうと、コンテナに含まれてしまうので関係ないファイルは置かないようにしましょう。

GemfileとGemfile.lock


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


GemfileはインストールするGemを定義しておくためのファイルです。

sourceには、GemのダウンロードもとのURLを記載しておきます。

そしてインストールするGemにはRailsのバージョンである5.0.0.1を指定しています。

このファイルが配置されているディレクトリで、$ bundle installコマンドを実行することで、RailsのGemをダウンロードして、インストールが実行されます。

Gemfile.lockは、最初の時点では空のファイルとなります。これは、通常直接編集するものではなく、$ bundle installを行った場合に、実際にインストールしたGemのリストとバージョンが自動的にGemfile.lockに配置されます。


Gemfile.lock
1
(空のファイル)


Gemfile.lockの用途は、サーバや他の開発者のPCなど、別の環境で同じRailsアプリを動かす場合に、同じGemをインストールするために仕様されます。

Gemのインストールの際にはインストールするGemを動かすために必要な別のGemも一緒にインストールされます。

こういったあるライブラリーが別のファイブラリを必要としていることを依存関係といいます。

Gemのインストール時には、この依存関係の解決が行われ、関係する様々なGemがまとめてインストールされます。

依存関係も含めて何がインストールされたのかが、すべてGemfile.lockに記載されます。

そして、このGemfile.lockを別のPCやサーバに持って行って、bundle installコマンドを実行すると、Gemfile.lockに記載された内容にしたがって、Gemのインストールが実行される、というわけです。

docker-compose.yml



Docker-compose.ymlは、Dockerで複数のコンテナを、設定に従ってまとめて起動するために使用します。

Docker-compose.ymlは、Dockerで複数のコンテナを、設定に従ってまとめて起動するために使用します。

Railsを実行するコンテナとMySQLサーバを実行するコンテナの二つを起動する定義を記載してあります。

以下のようなコードが書かれたファイルを用意します。

docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3' # docker-compose.ymlのフォーマットバージョン
services:
web: # Railsのコンテナ設定
build: . # docker-compose.ymlと同じディレクトリにあるdockerファイルを元にイメージを作成して使用することを意味している。
command: bundle exec rails s -p 3000 -b '0.0.0.0' # コンテナを起動した時にデフォルトで実行されるコマンド。TailsのWebサーバを起動するコマンドを記載。
volumes: # PC上のディレクトリをコンテナの/appディレクトリにマウント
- .:/app
ports:
- 3000:3000 # コンテナの外部に3000番ポートを公開。コロンの左側がコンテナ外に公開するポート番号で、コロンから右側が、コンテナ内で転送されるポート番号になります。
depends_on:
- db # Railsが起動する前にdbサービス、すなわちMySQLサーバが先に起動するように設定
tty: true # Railsでplyを使用してデバッグする際に必要な為、設定しています
stdin_open: true # Railsでplyを使用してデバッグする際に必要な為、設定しています
db: # MySQLサーバのコンテナ設定
image: mysql:5. # MySQLの5.7を使用
volumes:
- db-volume:/var/lib/mysql # db-volumeという名前でPC上に作成した領域をコンテナの/var/lib/mysqlディレクトリにマウント。これを設定しない場合、データベースのデータは、直にコンテナ上に保存されますが、コンテナが削除された場合には、データも一緒に消えてしまいます。
environment: # コンテナに設定する環境変数を定義しています。環境変数とはOS上で保持される変数のことで、ここで設定しているMYSQL_ROOT_PASSWORDは、MySQLのrootユーザのパスワードを設定するために使用しています。
MYSQL_ROOT_PASSWORD: password
volumes:
db-volume:

Rails開発環境の構築


ここまで解説した設定ファイルを使用して、Railsの開発環境を動かしてみます。

まずは、解説したファイルを配置したフォルダでターミナルを開きます。Windowsを使用している方は、PowerShellを使用しましょう。

terminal
1
2
3
4
5
6
$ cd documents/rails
$ ls -l
-rw-r--r-- 1 omashi 197121 365 2月 13 2018 docker-compose.yml
-rw-r--r-- 1 omashi 197121 205 8月 22 19:16 Dockerfile
-rw-r--r-- 1 omashi 197121 1748 8月 22 19:17 Gemfile
-rw-r--r-- 1 omashi 197121 4404 8月 22 19:17 Gemfile.lock

以下のコマンドを実行します。

terminal
1
$ docker-compose run web rails new . --force --database=mysql

docker-compose run webの部分は、docker-composeファイルに定義したweb:のRailsコンテナ設定を指しており、Railsのコンテナ上で、後ろに続くコマンドを実行することを意味しています。

--forceは既存ファイルを上書きするオプション。--database=mysqlはMySQLを使用する設定を明示的に示すオプションです。

実行が完了すると、Railsのファイルが作成されます。

terminal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ ls -l
total 33
drwxr-xr-x 1 user 197121 0 8月 22 19:17 app
drwxr-xr-x 1 user 197121 0 8月 22 19:17 bin
drwxr-xr-x 1 user 197121 0 8月 22 19:17 config
-rw-r--r-- 1 user 197121 130 8月 22 19:17 config.ru
drwxr-xr-x 1 user 197121 0 8月 22 19:17 db
-rw-r--r-- 1 user 197121 365 2月 13 2018 docker-compose.yml
-rw-r--r-- 1 user 197121 205 8月 22 19:16 Dockerfile
-rw-r--r-- 1 user 197121 1748 8月 22 19:17 Gemfile
-rw-r--r-- 1 user 197121 4404 8月 22 19:17 Gemfile.lock
drwxr-xr-x 1 user 197121 0 8月 22 19:17 lib
drwxr-xr-x 1 user 197121 0 8月 22 19:17 log
drwxr-xr-x 1 user 197121 0 8月 22 19:17 public
-rw-r--r-- 1 user 197121 227 8月 22 19:17 Rakefile
-rw-r--r-- 1 user 197121 374 8月 22 19:17 README.md
drwxr-xr-x 1 user 197121 0 8月 22 19:17 test
drwxr-xr-x 1 user 197121 0 8月 22 19:17 tmp
drwxr-xr-x 1 user 197121 0 8月 22 19:17 vendor

ここでGemファイルに追記されたGemのインストールや作成されたファイルをコンテナ内に取り込むために、以下のコマンドで、もう一度ビルドを実行します。

terminal
1
$ docker-compose build

ビルドが完了したらRailsで使用するデータベースの設定ファイルを編集します。
ファイルはConfigディレクトリ内にあるdatabase.ymlになります。
default:の項目にある、パスワードとホストを変更します。

パスワードは、docker-compose.ymlに記載したMySQL_ROOT_PASSWORD環境変数のpasswordに合わせる必要があります。
ホスト名もdocker-compose.ymlに記載したMySQLサーバのサービス名であるdbに合わせます。

/Config/database.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# MySQL. Versions 5.0 and up are supported.
#
# Install the MySQL driver
# gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
# gem 'mysql2'
#
# And be sure to use new-style password hashing:
# http://dev.mysql.com/doc/refman/5.7/en/old-client.html
#
default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: root
password: password # この部分を変更
host: db # この部分を変更

development:
<<: *default
database: app_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
<<: *default
database: app_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
# DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
# production:
# url: <%= ENV['DATABASE_URL'] %>
#
production:
<<: *default
database: app_production
username: app
password: <%= ENV['APP_DATABASE_PASSWORD'] %>

設定が完了したら、以下のコマンドを実行。のコマンドにより、RailsサーバーのコンテナとMySQLサーバのコンテナが起動します。

terminal
1
$ docker-compose up -d

コンテナが起動しているか確認します。

terminal
1
2
3
4
5
6
$ docker-compose ps
指定されたパスが見つかりません。
Name Command State Ports
--------------------------------------------------------------------------------
rails_db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
rails_web_1 bundle exec rails s -p 300 ... Up 0.0.0.0:3000->3000/tcp

起動はしましたが、まだ開発環境用のデータベースが作成されていない状態なので、次のコマンドでデータベースを作成します。

terminal
1
2
3
4
5
6
$ docker-compose run web bundle exec rake db:create
Starting rails_db_1 ... done
/usr/local/bundle/gems/activesupport-5.0.0.1/lib/active_support/xml_mini.rb:51: warning: constant ::Fixnum is deprecated
/usr/local/bundle/gems/activesupport-5.0.0.1/lib/active_support/xml_mini.rb:52: warning: constant ::Bignum is deprecated
Created database 'app_development'
Created database 'app_test'

これも先ほどと同様に、bundle exec以降がRailsのコンテナ内で実行されるコマンドです。

bundle exec rakeはRails環境にインストールされているrakeコマンドの実行を表しており、後ろにはdb:createと書いてあります。

rakeコマンドは、Railsで様々なタスクを実行する際に使用されるもので、rake db:createとした場合は、dbがまだ存在しない場合に新規に作成してくれます。

つまり、bundle exec rakeの部分は、Rails環境にインストールされているrakeコマンドを実行し、rake db:createでRailsで使用するデータベースをMySQLサーバ上に作成してくれます。

これで、Railsサーバにアクセス可能な状態になっているはずですので、ブラウザのURL欄にlocalhost:3000と打って開いてみましょう。

localhost:3000にアクセスした様子

まとめ

  • 4つのファイル(Dockerfile, Gemfile, Gemfile.lock, docker-compose.yml)を用意する
    • Dockerfile:
    • Gemfile:
    • Gemfile.lock
    • docker-compose.yml
  • 以下のコマンド、設定ファイルを編集して環境構築
    • $ docker-compose run web rails new . --force --database=mysql
    • $ docker-compose build
    • /Config/database.ymlを編集
    • $ docker-compose up -d
    • $ docker-compose run web bundle exec rake db:create
  • localhost:3000にブラウザでアクセス。

RailsとDockerの専門知識を身に着けたい方は以下がオススメ

- **Ruby on Rails 5を使用した即戦力レベルのアプリケーション作成のスキルを身に着けることができます。**Ruby言語の基礎から始め、Ruby on Rails5を使用したWebアプリケーションの開発方法について学びます。Railsの動作環境をDockerで構築する方法についても学びます。

フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座

Dockerに特化した専門知識を身に着けたい方は以下がオススメ

  • Dockerに特化した学習は以下のUdemy講座がおすすめです。質、ボリューム共に豊富です。(私はこの講座を終えるのに2か月かかりましたが、非常に詳しく分かりやすくまとめられた講座です。)

ゼロからはじめる Dockerによるアプリケーション実行環境構築

  • Dockerの基礎や復習に加え、コンテナオーケストレーションを行うKubernetesについて学びたい場合は以下の講座がおすすめです。質、ボリュームもちょうどよく、Kubernetesの各種リソースの解説に加え、Web3層構造(MongoDB, Node.js, Nginx)の環境を構築をするので、実践的なスキルが身につくと思います。

Docker + Kubernetes で構築する Webアプリケーション 実践講座

コメント