Help us understand the problem. What is going on with this article?

Docker × Ruby on Rails × MySQLの環境構築

Dockerのインストール

RubyとMySQLのDockerイメージをダウンロード

$ docker pull mysql:タグ名
$ docker pull ruby:タグ名
  • 完了したらStatus: Downloaded newer image for [ダウンロード対象]というメッセージが表示
  • ダウンロードされたかdocker imagesで確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ruby                タグ名               f28a9e1d0449        4 days ago          868MB
mysql               タグ名               ba7a93aae2a8        2 weeks ago         372MB
  • ダウンロードされていれば、上記内容が表示されるはず

Dockerfile作成

FROM ruby:2.6.0
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN gem install bundler
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install
ENV APP_HOME /app_name
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
ADD . $APP_HOME
  • FROM
    • 使用するイメージを指定。先ほどダウンロードしたRubyのイメージを指定。
  • ENV
    • 環境設定。形式は、key-valueとなっている。
  • RUN
    • 実行コマンド?ここに記載したコマンドは、ビルド時に実行される?
  • WORKDIR
    • RUNやADDなどの命令実行対象ディレクトリを指定
  • ADD

    • ファイルを追加する。形式は、ソース-送信先となっている
      • ソース
        • 追加したいファイルなどを指定
      • 送信先
        • どこにそのファイルなどを追加したいかを指定
  • apt-get update -qq

    • apt-get update
      • パッケージリストの更新
    • -qq
      • エラー以外は表示しない
  • apt-get install -y build-essential libpq-dev nodejs

    • apt-get install パッケージをインストール
    • -y
      • 全ての問い合わせに Yes で答える
    • build-essential
      • 基礎開発ツール一式が格納されたパッケージ
    • libpq-dev
      • よくわからないが、何かしらが格納されたパッケージ
    • nodejs
      • サーバーサイドのJavaScript

参考

Gemfile作成

source 'https://rubygems.org'
gem 'rails'
  • source
    • gemが置いてある場所を指定
  • gem
    • gemコマンドで使用するgemを指定

参考

空のGemfile.lock作成

$ touch Gemfile.lock
  • Gemfile.lock
    • Gemfileを元に実際にインストールされたgemに加え、依存関係にあるgemが記述されたファイル

docker-compose.yml作成

version: '2'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
  • version
    • 任意の値で定義なしはversion: '1'という扱いになる
  • services
    • バージョン2を指定した場合セットで定義
      • 以下にサービス内容を定義する
  • image
    • 既存イメージを用いる場合指定
  • environment
    • 環境変数などのexportをする
      • MySQLを使用する場合必須
  • command
    • デフォルトコマンドの上書き
  • volumes
    • マウント先指定
      • 形式は、[ホスト名:コンテナ]
        • 今回の場合だと、カレントディレクトリをapp_nameというディレクトリにマウントしている
  • ports
    • ポートを指定
      • 形式は、[ホスト:コンテナ]
  • depends_on
    • コンテナの作成順序と依存関係を決める

参考

Railsの雛形作成

$ docker-compose run web rails new . --force --database=mysql --skip-bundle
  • webのコンテナに対して、rails newで雛形作成
  • --force
    • 既存のGemfileを書き換える
      • この後に再度ビルドし直す必要があるので、この時点では--skip-bundleでビルドをスキップする

Gemfile編集

gem 'therubyracer', platforms: :ruby
  • therubyracerのコメントアウトを外す

参考

ビルドする

$ docker-compose build

database.ymlの編集

  • 編集点
    • password
      • docker-compose.ymlのMYSQL_ROOT_PASSWORDと同じ値にする
    • host
      • docker-compose.ymlのdepends_onと同じ値にする

※その他はRailsの雛形作成時に生成された内容で問題無いはず。

※編集後↓

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

コンテナの実行

$ docker-compose up -d
  • -d
    • バックグラウンドで実行
      • この後model作成がある為、バックグラウンドで実行

model作成

$ docker-compose run web rake db:create

You must use Bundler 2 or greater with this lockfile.が表示されたら…

  • Bundlerのバージョン2.0.1が悪さをしている模様。根本原因は不明。
  • 以下の手順で以前のバージョンを入れる
    • 1. gemfile.lockの中身全削除
    • 2. $ gem install bundler -v バージョン
      • 古いバージョンのBundlerのGem取得
    • 3. $ bundler バージョン install
      • Bundlerをインストール
    • 4. docker-compose build
      • ビルドし直す
    • 5. $ docker-compose run web rake db:create
      • 再度modelを作成する

参考

https://qiita.com/yoshijbbsk1121/items/87250501b32c6433943e

ブラウザアクセス

  • localhost:3000にアクセス

スクリーンショット 2019-02-24 14.27.36.png

お疲れ様でした!!!

おまけ

Twitterやってます!外部のエンジニアの方ともどんどん繋がりたいと考えていますので、是非フォローして頂ければと思います!@Tatsuo96
ブログ始めました!
https://note.mu/tatsuo_iriyama

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away