ども、Simi (@simi_log)です。
Windows環境でどうしてもDockerでRuby on Railsの環境構築をしたくて、Qitaなどのサイトを参考に色々やったんですが、エラーばかりで結局6時間以上か掛かりました・・・。
原因は全く分かっていませんが、Udemyを受講して解決しました。講座名は「フルスタックエンジニアが教える即戦力Railsエンジニア養成講座」です。環境構築のためにお金を使ってしまったわけですが、たったの1300円でRubyの基本からDockerの解説やユーザー認証機能、MySQLの基本、テストコードの書き方まで幅広く学べるので良い自己投資になりそうです。結果オーライ(笑)
てことで僕のように環境構築段階のエラーで時間を無駄に過ごしてしまう哀れで悲しい人を減らしたいという思いから、 今回はWindows環境でもDockerを使ってエラーなしでRuby on Railsの環境を構築する方法を共有します。
環境構築にあたって大まかな流れは以下です。
- Docker Toolboxの導入
- ディレクトリを構成する
- ビルドしてコンテナを起動する
- コンテナを起動してテストページを表示する
全く無の状態から僕が手こずった部分も紹介しながら説明していきます!
Docker Toolboxの導入
Windows10 HomeもしくはMacでは、仮想環境のLinux上でDockerを動かすことになります。仮想環境を作成するためにはVirtual Boxが必要なのですが、Virtual BoxとDockerの環境を簡単に構築してくれるのがDocker Toolboxというツールです。
Windosws10 Homeの方はDockerToolbox for Windowsを、Macの方はfor Macをインストールしてください。Windows10の場合で話を進めていきますがMacでも同様だと思います。
こちらのサイトにアクセスして下の方の「DockerToolbox-{最新バージョン}.exe」をクリックするとダウンロードが始まります。
ダウンロードが完了したらexeファイルをクリックしてインストールしましょう。オプションはデフォルトのままで、Nextを押しまくれば良いと思います。
インストールが完了するとデスクトップに3つのアイコンが作成されるます。
「Docker Quickstart Terminal」をダブルクリックで起動すると、初期設定が始まりDockerのクジラマークが表示されたら完了です。
以上で環境構築のベースは出来上がりました。
ディレクトリを構成する
任意のフォルダに以下ファイルを作成します。
- Dockerfile:Dockerの新しいイメージ作成用
- Gemfile
- Gemfile.lock
- docker-compose.yml
Gemfile.lockは空で良いですが、他は基本的に以下をコピペしてください。
Dockerfile
FROM ruby:2.4.5 RUN apt-get update -qq && apt-get install -y build-essential nodejs RUN mkdir /app WORKDIR /app COPY Gemfile /app/Gemfile COPY Gemfile.lock /app/Gemfile.lock RUN bundle install COPY . /app
- Rubyリポジトリのバージョン2.4.5のイメージを指定
- 仮想環境上のコンテナ内でbuild-essentialとnodejsをインストール
- コンテナのrootディレクトリにappディレクトリを作成
- appディレクトリに移動
- ホストPCにあるGemfileをコンテナ内のappディレクトリにコピー
- ホストPCにあるGemfile.lockをコンテナ内のappディレクトリにコピー
- gemfile.lockを元にgemのインストールを行います。
- ホストPCにあるファイルをすべてコンテナ内のappディレクトリにコピー
Gemfile
source 'https://rubygems.org' gem 'rails', '5.0.0.1'
- gemのダウンロード元URLを指定
- railsのバージョン5.0.0.1を指定
Dockerfile内のbundle installが実行されるとここで指定したrailsのgem(ライブラリ)がインストールされ、Gemfile.lockの中身が書き加えられます。
Gemfile.lock
これは空で大丈夫です。
Gemfile.lockはgemイントール後の結果図のようなものです。rails用のgemのインストール時に様々な種類のgemがインストールされますが、それらの依存関係をGemfile.lockに記載してくれます。
docker-compose.yml
version: '3' services: web: build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/app ports: - 3000:3000 depends_on: - db tty: true stdin_open: true db: image: mysql:5.7 volumes: - db-volume:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: password volumes: db-volume:
- 1行目はdocker-compose.ymlのバージョンを指定
- サービスのwebはRailsコンテナの定義でdbはMySQLサーバーコンテナの定義
- 4行目のbuildはymlファイルと同じディレクトリ(.)にあるDockerfileを元にイメージを作成
- 5行目commandでコンテナを起動したときにデフォルトで実行されるコマンドを指定(使用するのはrailsサーバー、ポート3000、バインドするipアドレスを0.0.0.0(すべてのネットワークインターフェース)に指定)
- 6, 7行目ではPC上のファイルをコンテナ内のappディレクトリにマウント(同期させるため)
- 8, 9行目ではPCの公開ポート番号:コンテナの転送先ポート番号を指定
- 10, 11行目ではrailsサーバーよりも早くMySQLサーバーを先に起動する設定
- 12, 13行目はデバッグ用
- 15行目では使用するMySQLのバージョンを指定
- 16, 17, 20,21行目ではPC上にdb-volumeという名前で作成したデータ保持領域をコンテナの/var/lib/mysqlディレクトリにマウント(同期させるため)
- 18, 19行目では環境変数の設定でMySQLのrootユーザーのパスワードを指定
ビルドしてコンテナを起動する
DockerQuickstartTerminal上でcd コマンドを使って先ほど作成したディレクトリに移動します。
そしたら以下コマンドを実行。
$ docker-compose run web rails new . –force –database=mysql
前半部の「docker-compose run web 」はdocker-comopse.ymlで定義したweb(Railsのコンテナ)で実行することを意味しています。
後半部ではコンテナ内の/appディレクトリ(.)に新しいRailsプロジェクトのファイルを作成します。PC上の現在のディレクトリとマウントしているため、同時に現在のディレクトリにもRailsのプロジェクトが作成されます。forceオプションは同じファイルがあった場合に上書きを行うための設定で、–databaseオプションは使用するデータベースに合ったプロジェクトファイルを作成するための設定です。
実行が終了するとディレクトリにプロジェクトが作成されます。
Gemfileの実行と作成されたファイルをコンテナに取り込むためにもう一度ビルドします。
以下コマンドを実行。
$ docker-compose build
ビルドが完了したらデータベースの設定をいじります。編集するのはconfigディレクトリのdatabase.ymlです。
以下の部分でpasswordをdocker-compose.ymlに記載したパスワードであるpasswordに、hostをMySQLサーバーのコンテナのサービス名であるdbにします。
default: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: password host: db
以下コマンドを実行すると、docker-compose.ymlに基づいてコンテナが起動します。
$ docker-compose up -d
以下コマンドでrailsサーバーとMySQLのサーバーのコンテナが起動していることを確認してください。
$ docker ps
続いて以下コマンドを入力して、開発環境用のデータベースを作成します。
$ docker-compose run web bundle exec rake db:create
rakeコマンドでデータベースがMySQLサーバー上に新規作成されるようです。
コンテナを起動してテストページを表示する
仮想マシンのIPアドレスを知るために以下コマンドを実行します。
$ docker-machine ip default
ここで表示されたIPをブラウザにぶちこみ、ポート番号を以下のように指定しましょう。
192.168.99.100:3000
Yay!You’re on Rails!が表示されたら成功です!いえあああ(笑)
まとめ
今回はWindows環境でDockerを使ってRuby on Railsの環境を構築する方法を紹介しました。
環境構築だけで半日を過ごしてしまいました・・・。作業中はWindowsを嫌いになってしまい、MacBook PROの購入ページを眺めていたほどです(笑)
Udemyではこんな感じの有益な情報を安くゲットできるので受講してみる価値は多いにあるかと思います。参考にしてみてください。
コメント