
DockerでRails環境を構築してみた
2022.05.12
くじらさんマークで有名な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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # ベースとなるイメージの指定(rubyのバージョン3.0.3を指定) FROM ruby:3.0.3 # ビルド時に実行するコマンドの指定 # インストール可能なパッケージの一覧の更新 RUN apt-get update -qq \ # パッケージのインストール(nodejs、postgresql-client、npmを指定) && apt-get install -y nodejs postgresql-client npm \ && rm -rf /var/lib/apt/lists/* \ && npm install --global yarn # 作業ディレクトリの指定 WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Configure the main process to run when running the image CMD ["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となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | version: "3" services: db: # コンテナ名の指定 container_name: rails_todo_db # イメージの指定 image: postgres:14.2-alpine # データの永続化(ホスト側のtmp/dbディレクトリにマウントする) volumes: - ./tmp/db:/var/lib/postgresql/data # 環境変数の指定(初期設定値) environment: POSTGRES_PASSWORD: password web: # コンテナ名の指定 container_name: rails_todo_web # Dockerfile のあるディレクトリのパスを指定(imageかbuildを必ず指定する必要がある) build: . # デフォルトのコマンド指定(Rails特有の問題解消とRails立ち上げを指定している) command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" # データの永続化(ホスト側のカレントディレクトリにマウントする) volumes: - .:/myapp # ポートの指定(外部からのアクセス時のポート:Dockerコンテナからアクセス時のポート) ports: - "3000:3000" # 依存関係の指定(dbが起動した後に、webが起動するようになる) depends_on: - db |
⑧ 作成したdocker-compose.ymlに上記をまるごと貼り付ける
⑨ entrypoint.shを作成する
1 | $ touch entrypoint.sh |
entrypoint.sh
Rails固有の問題を修正するためのファイルです。sarver.pidというファイルがネックになるため、毎回削除するようにします。
1 2 3 4 5 6 7 8 | #!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@" |
⑩ 作成した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を活用されてみてはいかがでしょうか?
書いた人はこんな人

IT技術10月 31, 2023Cloud Runのいろんな設定を確認してみた
IT技術6月 5, 2023【ISUCON部】ISUCONの存在を知らなかったけど、ISUCON部に参加してみた
IT技術5月 12, 2022DockerでRails環境を構築してみた
ライトコードの日常1月 25, 2022YOUは何しにライトコードへ?〜こやまん編〜