ややめも

アプリ作りたい女子大学院生のめも💁‍♀️

技術メモ
日記
つくったもの
就活の話

DockerでRailsAPIモードとMySQLの環境構築

ちょうどAPIを作ることになったので、今更ながらDockerで環境構築をした時のメモ。

こんな感じで混乱していたので、まとめました。(ヘルプしてくださった方ありがとうございます🙏)

概要

docs.docker.com

logicoffee.hatenablog.com

この辺りを参考に環境を作りました。
ただ、私の場合はMySQLの方は特にカスタマイズする必要性がなかったので、Dockerfileを書かずに公式のimageを使う構成にしました。


ディレクトリ構成

appname/
├── docker-compose.yml
├── Dockerfile
├── Gemfile
└── Gemfile.lock


Dockerfileにrubyの環境設定、
docker-compose.ymlにてサーバーコンテナとMySQLコンテナに関する設定、
GemfileにインストールするRailsのバージョンを書き、buildしていきます。

各種ファイルの設定

# docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    volumes:
      - .:/appname
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
  db:
    image: mysql:5.7
    volumes:
      - ./db/data:/var/lib/mysql/
      - ./db/conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: password
    expose:
      - "3306"

それぞれのキーについて

services : サービスを定義。今回はwebサーバー用のwebと、MySQL用のdbを準備。

image : 公開されているイメージを指定。ローカルになければリモートからpullしてくれる。

build : Dockerfileのあるパスを指定して、docker-compose buildの時にこのDockerfileからimageをbuildできる。

depends_on : それぞれのサービスの依存関係を記載。この場合は先にdbを起動してからwebを起動ということ。

volumes : (ホスト:コンテナ)の形式でマウントしてくれる。マウントに関してはこの記事がわかりやすい。
また、- ./db/data:/var/lib/mysql/と設定することで、DBも永続化できる。データベースの永続化に関してはこのサイトがいい感じにまとまっていた。

command : コンテナ起動時のデフォルトのコマンドを指定できる。この場合は、webのコンテナを起動したらrails s -p 3000 -b '0.0.0.0'を実行してくれる。(ただこの-b '0.0.0.0'がどうして必要なのかまだよくわかっていないので調べている途中。)

environment : 環境変数の設定ができる。MySQLだと以下のリファレンスを見るとどのようなものが設定できるかわかる。
docs.docker.com


各々のサービスには
公開されているイメージを使うためにdocker imageを指定するか、
自作のDockerイメージを使用する場合に、buildにDockerfileのパスを記述するかのどちらかを書かなきゃいけない。


DockerfileとRailsインストール用のGemfile、Railsプロジェクトの立ち上げ後のdatabase.ymlに関してはこちらの記事と同じです。

プロジェクトのビルド

全部書いたら、

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

$ docker-compose build

で、RailsプロジェクトをAPIモードで作成して、database.ymlの設定をする。

# バックグラウンドでコンテナ起動
$ docker-compose up -d

# database作成
$ docker-compose exec web rails db:create

で、localhost:3000でアクセスすれば動くはず。

ちなみに各種サービスに対してコマンドの実行は

$ docker-compose exec (サービス名) コマンド

これで実行できる。
runでもexecでもほぼ似たような動きをするが、
run新しくコンテナを立ち上げてから実行
exec既に立ち上がっているコンテナにて実行という違いがある。

例えば起動中のコンテナの中で作業したい場合は、

$ docker exec (サービス名)  bash

こんな感じでコンテナの中に入れる。


共同で作業する場合は、リモートリポジトリからこのrailsプロジェクトを引っ張ってきて、
dockerがインストールされていれば、docker-compose buildして起動してdbを作るだけですぐ実行できます。
これ使いこなせたらめっちゃ楽ーーーー。


間違っているところや、こうしたほうがいいよーっていうアドバイスがあれば教えてください。