【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にブラウザでアクセス。

あとはコードを書きながら学習するだけです。

忙しい毎日を過ごしながらも効率的にプログラミングを学びたい方に最適なプログラミングスクール・教材を記事にまとめてますので、よろしければ以下の記事も見ていってください。

>> 【厳選4つ】未経験におすすめのプログラミングスクール・教材! - omathin blog

「1万円以上お金が出せない」「低コストでRailsの基礎を学びたい」という方はUdemyを活用した学習も検討してみてください。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームなので安心です。

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

コメント