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

超初心者がDocker for MacでRuby + Rails + Mysqlの開発環境を構築

More than 3 years have passed since last update.

はじめに

Dockerの知識が全くない超初心者がDockerでRailsの開発環境を作成できたので、嬉しさのあまり手順を忘れないよう記録しておきます。


わからなければ以下のサイトを参考にすれば良さそう!


Docker for Macのインストール

Docker for Macからインストーラをダウンロード。

私は「Get Docker for Mac (stable)」を選択しました。
ダウンロードした「Docker.dmg」を起動して、アプリケーションディレクトリに移動。
Dockerアプリをクリックして、OKボタン連打してたらできました。


Dockerの起動

なんか勝手に起動してた。

【Dockerの確認】

$ docker --version
Docker version 1.13.0, build 49bf474


Dockerイメージのダウンロード

今回使用するRubyとMySQLの2つのイメージをダウンロードします。

$ docker pull ruby:2.4.0
$ docker pull mysql:5.7

ダウンロードの際は、最新のバージョンでも「latest」とせずにバージョン指定した方がいいと思います。

【ダウンロードしたイメージの確認】

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ruby                2.4.0               3b80506f9634        7 days ago          676 MB
mysql               5.7                 f3694c67abdb        8 days ago          400 MB

最初「latest」でダウンロードしたら、Tagの部分が「latest」と表示されてバージョンがわからなくなった。


Railsアプリケーション用のディレクトリを作成

このディレクトリで今後作業を行なっていく事になります。

$ mkdir ~/works/app_name
$ cd ~/works/app_name


Dockerfileの作成

イメージを作る際の命令をまとめて記載できるらしい。

$ vi Dockerfile



Dockerfileに以下を記載

FROM ruby:2.4.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

それぞれのコマンドの意味はDockerfile リファレンスで確認できます。


Gemfileの作成

$ vi Gemfile

現時点では、railsをインストールするだけのコマンドでOK!!

source 'https://rubygems.org'
gem 'rails'


空のGemfile.lockの作成

Dockerfile の構築には、空の Gemfile.lock が必要だそう。
なので、touchで作成

$ touch Gemfile.lock


docker-compose.ymlの作成

複数のコンテナをうまいことするために定義するファイル。
今回「Rubyコンテナ」「MySQLコンテナ」2つのコンテナを作成するので必要。

$ vi docker-compose.yml

以下の内容を記載

version: '2'
services:
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=password
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_name
    ports:
      - "3000:3000"
    depends_on:
      - db

今回「db」と「web」という2つのサービスを定義しました。

詳しいことはCompose ファイル・リファレンスで確認できます。


コンテナにRailsアプリを作成

「docker-compose run」コマンドで「web」コンテナに「rails new」を行う。

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

実行後、app_nameディレクトリの中にRailsのファイル群が作成されていると思います。


Gemfileの変更

therubyracer の行のコメントを外す

gem 'therubyracer', platforms: :ruby

Gemfileの変更を適用するためには以下のコマンドを実行

$ docker-compose build


config/database.ymlの設定

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: password
  host: db
...

注意点は2つ

  • passwordをdocker-compose.ymlの「MYSQL_ROOT_PASSWORD」と同じにする
  • hostをdocker-compose.ymlの「depends_on」と同じにする


コンテナの実行 & ブラウザ確認

コンテナを実行して、Rails Serverを起動します。
以下コマンドを実行したら、勝手にRails Serverも起動してくれます。

$ docker-compose up

【コンテナの確認】

$docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                    NAMES
6ae573faa39d        appname_web         "bundle exec rails..."   About an hour ago   Up About an hour          0.0.0.0:3000->3000/tcp   appname_web_1
8e5ba954f054        mysql:5.7           "docker-entrypoint..."   About an hour ago   Up About an hour          3306/tcp                 appname_db_1



最初はデータベースがないみたいなこと(Unknown database 'app_name_development')を言われるので、別タブを開いて

$ docker-compose run web rake db:create

とすればOK!!!

あとは、ブラウザからlocalhost:3000を叩いたら...


Railsアプリケーションを作成方法

コントローラーを作成。

$ docker-compose run web rails g controller welcome index

ローカルにcontrollerが作成されているはず。

基本的にRailsコマンドの最初に「docker-compose run web」をつけてやればコンテナ上で実行され、Mac側にも反映されます。

あとHOST側(自分のMacの方)の~/works/app_name/config/routes.rbに以下を記載。

root 'welcome#index'

この状態でlocalhost:3000を叩けば反映されているはずです。

あとはローカルでプログラムを書いていけば、勝手にコンテナ側に反映されるので開発できるのではないでしょうか!!!


コンテナの停止と起動

今回の場合「Ctrl + c」でwebコンテナもMySQLコンテナも停止します。

$docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
6ae573faa39d        appname_web         "bundle exec rails..."   About an hour ago   Exited (137) 5 seconds ago                       appname_web_1
8e5ba954f054        mysql:5.7           "docker-entrypoint..."   2 hours ago         Exited (137) 5 seconds ago                       appname_db_1

StatusがExitedになってたら止まってます。



起動は

$ docker-compose up


コンテナとイメージの削除

コンテナの削除

$ docker rm {CONTAINER ID}



イメージの削除

$ docker rmi {IMAGE ID}

イメージの上にコンテナが作成されるので、コンテナから先に削除する方が良いそうです。

Gemfile変更後の「docker-compose build」で作成した後に見受けられる<none>というイメージを削除するのによく使用します。


注意点

  • Gemfileを変更したら、buildでイメージ作成してから、コンテナ実行すること
$ docker-compose build
$ docker-compose up

この際、イメージに<none>ってのができます。
なんか邪魔なのでいつも削除してます。


最後に

私はDockerに関して全く知識はありません。
それでも、一応ですが開発環境の構築ができたので、それがもう嬉しくて嬉しくて。
勢いだけで書いてしまったので、わかりにくい点も多数あるとは思いますが、ご容赦ください。
あとはここにApacheを組み込みたいのですが、やり方が全くわからず。。

以上です。

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
No 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
ユーザーは見つかりませんでした