DockerでRails環境を構築してみた
IT技術
くじらさんマークで有名なDockerですが、仮想化をゴニョゴニョするんだなというふわふわした認識で、実際に自分自身で構築したことがなかったので、今回思い切って構築を試してみました。
本記事は、2022年4月27日時点のものです。
Dockerとは
アプリケーションの構築、共有及び実行を効率的に行える、1300万人以上の開発者、700万以上のアプリケーションに利用されているソフトウェアです。
コンテナを積んだクジラのロゴが有名で、コンピューターの資源を分離するコンテナ仮想化を表しているようです。
Dockerを利用することで、従来は、時間を要していた環境構築がスムーズに進み、開発作業に専念することが出来ます。
実際にDockerを使ってみる
前提
- Dockerを導入済みであること
- Macを利用していること(Windowsの場合、一部コマンドは変えないといけないのでご注意ください)
今回は、RailsのTodoアプリをDocker環境で動かしてみたいと思います。
① ディレクトリを作成する($を外して、ターミナル等に入力してください)
1$ mkdir Documents/Rails_Todo_Docker
② 作成したディレクトリに移動する
1$ cd Documents/Rails_Todo_Docker
③ RailsのToDoアプリケーションをGithubからクローンする
1$ git clone https://github.com/KonoLevel1/Rails_ToDo.git
④ クローンしたディレクトリに移動する
1$ cd Rails_Todo
⑤ Dockerfileを作成する
1$ touch Dockerfile
Dockerfile
Dockerイメージを作成する際に使用するファイルです。
1# ベースとなるイメージの指定(rubyのバージョン3.0.3を指定)
2FROM ruby:3.0.3
3
4# ビルド時に実行するコマンドの指定
5# インストール可能なパッケージの一覧の更新
6RUN apt-get update -qq \
7# パッケージのインストール(nodejs、postgresql-client、npmを指定)
8&& apt-get install -y nodejs postgresql-client npm \
9&& rm -rf /var/lib/apt/lists/* \
10&& npm install --global yarn
11
12# 作業ディレクトリの指定
13WORKDIR /myapp
14COPY Gemfile /myapp/Gemfile
15COPY Gemfile.lock /myapp/Gemfile.lock
16RUN bundle install
17# Add a script to be executed every time the container starts.
18COPY entrypoint.sh /usr/bin/
19RUN chmod +x /usr/bin/entrypoint.sh
20ENTRYPOINT ["entrypoint.sh"]
21EXPOSE 3000
22# Configure the main process to run when running the image
23CMD ["rails", "server", "-b", "0.0.0.0"]
⑥ 作成したDockerfileに上記をまるごと貼り付ける
⑦ docker-compose.ymlを作成する
1$ touch docker-compose.yml
docker-compose.yml
docker-compose.ymlでは、複数のコンテナ定義を記述し、複数のコンテナを管理するためのファイルです。
2022年4月27日現在、最新のバージョンは、3.8となっています。
1version: "3"
2services:
3 db:
4 # コンテナ名の指定
5 container_name: rails_todo_db
6 # イメージの指定
7 image: postgres:14.2-alpine
8 # データの永続化(ホスト側のtmp/dbディレクトリにマウントする)
9 volumes:
10 - ./tmp/db:/var/lib/postgresql/data
11 # 環境変数の指定(初期設定値)
12 environment:
13 POSTGRES_PASSWORD: password
14 web:
15 # コンテナ名の指定
16 container_name: rails_todo_web
17 # Dockerfile のあるディレクトリのパスを指定(imageかbuildを必ず指定する必要がある)
18 build: .
19 # デフォルトのコマンド指定(Rails特有の問題解消とRails立ち上げを指定している)
20 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
21 # データの永続化(ホスト側のカレントディレクトリにマウントする)
22 volumes:
23 - .:/myapp
24 # ポートの指定(外部からのアクセス時のポート:Dockerコンテナからアクセス時のポート)
25 ports:
26 - "3000:3000"
27 # 依存関係の指定(dbが起動した後に、webが起動するようになる)
28 depends_on:
29 - db
⑧ 作成したdocker-compose.ymlに上記をまるごと貼り付ける
⑨ entrypoint.shを作成する
1$ touch entrypoint.sh
entrypoint.sh
Rails固有の問題を修正するためのファイルです。sarver.pidというファイルがネックになるため、毎回削除するようにします。
1#!/bin/bash
2set -e
3
4# Remove a potentially pre-existing server.pid for Rails.
5rm -f /myapp/tmp/pids/server.pid
6
7# Then exec the container's main process (what's set as CMD in the Dockerfile).
8exec "$@"
⑩ 作成したentrypoint.shに上記をまるごと貼り付ける
⑪ サービスを構築する
1$ docker-compose build
⑫ 立ち上げ
1$ docker-compose up -d
⑬ コンテナに入る
1$ docker container exec -it rails_todo_web bash
⑭ マイグレーション
1$ rails db:migrate
⑮ 下記にアクセスして動作することを確認
http://localhost:3000
これで、ローカル環境にDockerでRailsの環境構築を行うことができました。
Dockerで環境構築を行っているので、例えローカルにRails環境がなくとも動作します。
勿論、Dockerfileやdocker-compose.ymlの内容を変えることで、Rails以外にも様々な環境が構築できます。
皆さんも、環境構築にDockerを活用されてみてはいかがでしょうか?
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ