こんにちは、はんぺらです。
プログラミングを勉強中の方々、勉強は捗っていますか?
環境構築からやろうとすると、そこで躓くこともあるかと思います。
僕は普段はDockerで開発環境を作っています。
そこで、僕が普段行っているRubyOnRails+MySQLの環境構築の手順を纏めたので、参考にしてみて下さい!
Contents
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ならTerminal、Windowsなら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 を作ります。
DockerfileFROM 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を下記の内容で作ります。
Gemfilesource '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.ymlversion: '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ライフをお過ごし下さい。