ハウテレビジョン開発者ブログ

『外資就活ドットコム』を日夜開発している技術陣がプログラミングネタ・業務改善ネタ・よしなしごとについて記していきます。

Docker初心者がRails+MySQLの環境構築をDockerでやってみた

はじめに

先日リリースした弊社のリニューアルされたiOSアプリのサーバーサイドはDockerで環境構築されております。
Dockerはとても便利で、設定されていば簡単なコマンドを叩くだけであっという間に開発環境が整ってしまいます。
しかし、その便利さ故にDockerを特に意識することなく時だけが過ぎてしまいました、、、
先日何気なく弊社のDocker周りの設定をふと見てみたら、何が書いてあるか全く理解できず(TдT)
これはまずいと思いDockerの勉強をはじめることにしました。
今回はDocker初心者が勉強がてらRails+MySQLの環境構築ができるか試してみました。

f:id:hy616:20180716143345p:plain

環境

今回構築するのは以下の環境です。

  • Ruby 2.5.1
  • Rails 5.2.0
  • MySQL 5.7

参考(事前勉強)

Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント
クイックスタート・ガイド:Docker Compose と Rails — Docker-docs-ja 17.06.Beta ドキュメント

Dockerfile作成

Dockerfileとは、Dockerコンテナの構成内容をまとめて記述しておくファイルです。
ここに書かれた内容をもとに、Dockerイメージが構築されます。
以下を記述します。

FROM ruby:2.5.1
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential mysql-client nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /myapp
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME

Dokerfileで使用している命令について軽く説明します。

FROM(必須)

コンテナのベースとなるイメージを指定します。
DockerHubで公開されているイメージや、自作のイメージも指定できます。

ENV

環境変数を設定します。

RUN

FROMで指定したイメージ上で、コマンドを実行します。
パッケージのインストールなどに用います。

WORKDIR

作業するディレクトリを変更します。

ADD

指定したファイルやディレクトリをコンテナ内にコピーします。

※上記以外にも命令はいくつかあるのでご興味があれば公式ドキュメントを参照ください。

Gemfile作成

今回はversion:5.2.0を指定しています。

source 'http://rubygems.org'
gem 'rails', '~> 5.2.0'

Gemfile.lockを作成

Gemfile.lockが必要なので、空のファイルを作成しておきます。

$ touch Gemfile.lock

docker-compose.yml作成

複数のコンテナを一括管理するための構成管理ファイル。
docker-compose up コマンドで記述したサービスが全て立ち上がります。
今回はRubyとMySQLの2つのコンテナの設定をします。

version: '3.4'
services:
  db:
    image: mysql:5.7.17
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/volumes:/var/lib/mysql
    env_file: .env.dev
  web:
    build:
      context: .
      dockerfile: ./docker/rails/Dockerfile
    command: /bin/sh -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    ports:
      - "3000:3000"
    volumes:
      - .:/myapp
    environment:
      RAILS_ENV: development
    env_file: .env.dev
    depends_on:
      - db

上の記述について軽く解説します。

version

Compose ファイルのバージョンを指定できます。

image

ベースイメージを指定します。

ports

ホスト側とコンテナ側の両方のポートを指定できます。(ホスト:コンテナ)
コンテナポートのみを指定した場合は、ホスト側のポートはランダムで指定されます。

volumes

ボリュームをマウントするときに指定します。

env_file

指定したファイルから環境変数を追加します。

depends_on

コンテナの作成順序と依存関係を決められます。
※開始の順序を制御するだけで、コンテナ上のアプリケーションが利用可能になるまで待つという制御は行いません。

※上記以外にも命令はいくつかあるのでご興味があればこちらについても公式ドキュメントを参照ください。

.env.dev作成

パスワードは別で管理したいため、.env.devを作成します。
ここに任意のユーザーとパスワードを設定します。

MYSQL_USER=****
MYSQL_PASSWORD=****
MYSQL_ROOT_PASSWORD=****

Railsアプリケーション作成

docker-compose runコマンドでwebコンテナの中でrails newコマンドを実行します。
ここでdatabaseにMySQLを指定します。

$ docker-compose run --rm web rails new . --force --database=mysql --skip-bundle

イメージをビルド

$ docker-compose build

config/database.ymlを編集

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %>
  host: db

development:
  <<: *default
  database: development

コンテナを起動

下のコマンドでRailsサーバーとMySQLサーバーを起動してくれます。

$ docker-compose up

データベースを作成

最初はデータベースがまだ作られていないので、以下のコマンドでデータベースを作成します。

$ docker-compose run --rm web rake db:create

http://localhost:3000 にアクセス

なんとかRailsが動いていることが確認できました。

f:id:hy616:20180702015927p:plain

まとめ

今回はDockerを用いて、Rails+MySQLの環境構築を試してみました。
Dockerに関しての知識があまりなくても、最低限ですがRails+Mysqlの環境構築はできました。

個人的にはDockerの学習は、コンテナを立ち上げるまでは学習コスト低めだと思いますが、実際の運用にはもっと多くのノウハウが必要なので、総合して学習コストは高いのかなと感じました。
しかしその反面、他の作業者と同じ環境が簡単に用意できるのはとても魅力的だと感じました。
まだDockerを触ったことがない方はぜひ触ってみてはいかがでしょうか。

ハウテレビジョンでは絶賛エンジニア採用中です!

ここまで読んで頂きありがとうございます。
Docker、Rails、ReactNative、Goなどを業務で使ってみたいエンジニアの方がいらっしゃいましたら、ぜひとも一度オフィスに遊びに来てお話しましょう!

ご連絡はこちらからお願いします!