プログラミング

DockerでRubyOnRails+MySQLの開発環境を作ってみよう

こんにちは、はんぺらです。

プログラミングを勉強中の方々、勉強は捗っていますか?

環境構築からやろうとすると、そこで躓くこともあるかと思います。

僕は普段はDockerで開発環境を作っています。

そこで、僕が普段行っているRubyOnRails+MySQLの環境構築の手順を纏めたので、参考にしてみて下さい!

Dockerのインストール

まず、Dockerをインストールしないと、始まらないのでインストールをします。

ただし、ダウンロードするにはアカウント作成が必要です。

下記はダウンロードリンクなのですが、未ログイン状態だとログインページへのボタンが表示されていると思います。

MAC
https://hub.docker.com/editions/community/docker-ce-desktop-mac

Windows
https://hub.docker.com/editions/community/docker-ce-desktop-windows

上記ページ内にあるログインページヘのボタンをクリックし、ログインページに行きます。

そして、ログインページ内にアカウント作成のリンクがあるので、そちらのページにアクセスしアカウント作成を完了させて下さい。

アカウント作成後、メールが送られてくるので、メール本文にあるリンクをクリックすると登録が完了し、ダウンロードできるようになります。

ダウンロードが完了したら、ファイルをクリックし、インストールを完了させて下さい。

インストール完了後、Dockerを起動させ、MacならTerminalWindowsならPowerShell(コマンドプロンプトもありますが、廃止予定とのことなのでPowerShellがおすすめ)を開き、下記コマンドで正常にDockerが起動できているか確認します。

$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

上記のように表示されていれば、インストールは無事に完了です。

Dockerイメージを作成する

次にRailsアプリケーション用のDockerイメージを作成していきましょう。

どこでも良いので、Docker用の作業ディレクトリを作ります。

これからはこの作業ディレクトリ内で作業を進めることになります。

まず、その作業ディレクトリ内に下記の内容で Dockerfile を作ります。

Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y nodejs mysql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

次に、同じく作業ディレクトリ内にRailsのパッケージ管理用ファイルである Gemfileを下記の内容で作ります。

Gemfile
source 'https://rubygems.org'
gem 'rails', '~>5'

さらに、空のGemfile.lock も作ります。

最後に、dockerコンテナ起動時に実行されるシェルファイルを entrypoint.sh という名前で作ります。

このファイルはDockerコンテナ起動時に実行されます。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

これでDockerイメージ作成の前準備は完了です。

最後に下記コマンドを実行し、Dockerイメージを作成しましょう。

“quickrails_web” の部分は “作業ディレクトリ名_web” としておいてください。

docker build . -t quickrails_web

※最後のイメージを作成する作業はスキップしても問題はないですが、分かりやすいように追加しています。これをスキップしても、手順3の中の “docker-compose run” コマンドを実行したタイミングで自動的にイメージは作成されます。

docker-compose.ymlファイルの作成

手順2ではDockerイメージを作成しました。

次に、2で作ったイメージと、DockerHubから取得できるMysqlのイメージを使用して、docker-compose.ymlファイルを作っていきます。

docker-compose.ymlはDockerコンテナを起動する際の設定ファイルのようなイメージです。

作成場所は、変わらず作業ディレクトリの中です。

下記、docker-compose.ymlファイルの中身です。

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: quickrails_dev
    volumes:
      - ./tmp/db:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

Dockerコンテナを起動

ここまで来てやっと、Dockerコンテナを起動できます。

ですが、このまま通常起動させても、Railsアプリケーションの初期化ができていないので、エラーが出てしまいます。

試しに、このままの状態でDockerコンテナを起動させてみましょう。
下記のコマンドがDockerコンテナを起動させる為のコマンドになるので、実行してみましょう。

$ docker-compose up

すると、沢山メッセージが出ますが、途中で下記のようなメッセージが出て起動に失敗すると思います。

quickrails_web_1 exited with code 0

これを正常起動させるためには、Railsアプリケーションの初期化データベースの設定Dockerイメージの再ビルドが必要です。

一つづつやっていきましょう。

Railsアプリケーションの初期化

初期化は簡単で、下記コマンドを実行するだけで完了です。

$ docker-compose run --rm web rails new . --force --no-deps --database=mysql

上記コマンドを実行すると、自分の作業ディレクトリ以下に沢山のファイルが作成されます。

下記は、コマンド実行後の僕の作業ディレクトリ以下のファイル一覧です。

$ ls -l
total 80
-rw-r--r--   1 hanpera  staff   441 Jun 18 23:12 Dockerfile
-rw-r--r--   1 hanpera  staff  2216 Jun 18 23:43 Gemfile
-rw-r--r--   1 hanpera  staff  5285 Jun 18 23:44 Gemfile.lock
-rw-r--r--   1 hanpera  staff   374 Jun 18 23:43 README.md
-rw-r--r--   1 hanpera  staff   227 Jun 18 23:43 Rakefile
drwxr-xr-x  10 hanpera  staff   320 Jun 18 23:43 app
drwxr-xr-x   9 hanpera  staff   288 Jun 18 23:44 bin
drwxr-xr-x  16 hanpera  staff   512 Jun 18 23:43 config
-rw-r--r--   1 hanpera  staff   130 Jun 18 23:43 config.ru
drwxr-xr-x   3 hanpera  staff    96 Jun 18 23:43 db
-rw-r--r--   1 hanpera  staff   434 Jun 18 23:10 docker-compose.yml
-rw-r--r--   1 hanpera  staff   202 Jun 18 23:08 entrypoint.sh
drwxr-xr-x   4 hanpera  staff   128 Jun 18 23:43 lib
drwxr-xr-x   3 hanpera  staff    96 Jun 18 23:43 log
-rw-r--r--   1 hanpera  staff    63 Jun 18 23:43 package.json
drwxr-xr-x   9 hanpera  staff   288 Jun 18 23:43 public
drwxr-xr-x   3 hanpera  staff    96 Jun 18 23:43 storage
drwxr-xr-x  11 hanpera  staff   352 Jun 18 23:43 test
drwxr-xr-x   5 hanpera  staff   160 Jun 18 23:43 tmp
drwxr-xr-x   3 hanpera  staff    96 Jun 18 23:43 vendor

データベースの設定

config/database.ymlファイルを下記のように修正します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: user
  password: password
  host: db

development:
  <<: *default
  database: quickrails_dev

Dockerイメージの再ビルド

最後にこれまでの修正をDockerイメージに取り込む為に、再度ビルドを行います。

下記どちらのコマンドでもビルドは可能です。

docker build . -t quickrails_web
docker-compose build

“quickrails_web” の部分は “作業ディレクトリ名_web” に各自変更して下さい。

これでやっと起動の準備は整いました。
下記コマンドで実行してRailsを立ち上げてみましょう。

docker-compose up

下記ログが確認できれば起動は完了しています。

web_1 | => Booting Puma
web_1 | => Rails 5.2.3 application starting in development
web_1 | => Run `rails server -h` for more startup options
web_1 | Puma starting in single mode...
web_1 | * Version 3.12.1 (ruby 2.5.5-p157), codename: Llamas in Pajamas
web_1 | * Min threads: 5, max threads: 5
web_1 | * Environment: development
web_1 | * Listening on tcp://0.0.0.0:3000
web_1 | Use Ctrl-C to stop

さあrailsが立ち上がりました。
下記URLにアクセスしてページを確認してみましょう。

http://localhost:3000

Dockerコンテナ内で様々なコマンドを実行

開発しているとDockerコンテナ内で色々なコマンドを実行したいと思うと思います。

その場合は、下記コマンドでコンテナ内でコマンドを実行可能です。

docker exec -it コンテナ名 コマンド

下記、よく使用するコマンドです。

DBにつなぐ

docker exec -it quickrails_db_1 mysql -uuser -ppassword

Bundle installを実行

docker exec -it quickrails_web_1 bundle install

まとめ

今回はDockerでRails+Mysql環境を立ち上げてみました。

Docker初心者の方などは色々と分からない箇所があったと思いますが、一つづつ理解していきましょう。

下記、DockerのReferenceページになるので、分からない箇所は調べてみて下さい。

https://docs.docker.com/reference/

では、楽しいDockerライフをお過ごし下さい。