Windows11 + Docker環境でRuby on Rails+PostgreSQLの環境構築

# 自己紹介
来年から新卒入社でエンジニアとして働き始める蛇姫と申します。
Ruby on Railsで開発を行った際にDockerを使用したので備忘録として残したいと思います。
初めての記事投稿なので至らないところも多々あるかとは思いますが、何か間違い等ありましたらご指摘のほどよろしくお願いいたします。

# 背景
システムの開発にあたって最初はWindows上で開発を行っていたのですが、AWSにデプロイする際に、[unicornのインストールがWindowsでは行えなかったため](https://teratail.com/questions/355134)、dockerを用いてunicornを利用できる開発環境を用意することにしました。

# 前提条件
* Docker Desktopがインストール済みであること
* WSLがインストール済みであること

# 構成情報(2023年12月16日)
* Windows 11 home
* ruby 3.2.2
* Ruby on Rails 7.1.2
* Docker version 24.0.5
* Ubumtu 22.04 LTS
* PostgreSQL 15.4

# ファイルの準備
プロジェクトのディレクトリに以下のファイルを用意する。
* Dockerfile
* compose.yaml
* entrypoint.sh
* Gemfile
* Gemfile.lock

各ファイルの中身は以下の通り
```dockerfile:Dockerfile
#rubyのバージョン
FROM ruby:3.2.2

RUN apt-get update -qq && apt-get install -y postgresql-client
RUN mkdir /apps
WORKDIR /apps

COPY ./Gemfile /apps/Gemfile
COPY ./Gemfile.lock /apps/Gemfile.lock
RUN bundle install
RUN bundle update

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh && cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ENTRYPOINT [ "entrypoint.sh" ] #entrypoint.shを実行

EXPOSE 3000

CMD [ "rails" ,"server","-b","0.0.0.0" ] #rails serverを起動するコマンド
```

```yaml:compose.yaml
version: '3.8'
services:
  db:
    image: postgres
    volumes:
      - pg_data:/var/lib/postgresql/pg_data
    environment:
      POSTGRES_USER: dev     #ユーザー名
      POSTGRES_PASSWORD: dev #パスワード
      POSTGRES_DB: dev
      
  web:
    build: .
    volumes:
      - .:/apps
    ports:
      - "3000:3000"
    tty: true
    stdin_open: true
    depends_on:
      - db
    working_dir: /apps

volumes:
  pg_data:
    driver: local
```
```sh:entrypoint.sh
#!/bin/bash
set -e

rm -f /apps/tmp/pids/server.pid

exec "$@"
```
```:Gemfile
source "https://rubygems.org"
gem "rails", "~> 7.1.2"
```
```:Gemfile.lock
```

# コンテナの作成
上記のファイルを準備したら、コマンドプロンプトで目的のディレクトリに移動し(ここではrailsフォルダ)コマンドを実行する。

```
cd rails
```
```
docker-compose run --rm web rails new . --database=postgresql --skip-docker
```
上記のコマンドを実行するとrailsのインストールが始まる。
少しすると
`conflict  Gemfile`
`Overwrite /apps/Gemfile? (enter "h" for help) [Ynaqdhm] `
と表示される。これは作成したGemfileがあるが上書きしてよいかの確認である。
上書きして問題無いので y を入力する。
しばらくするとインストールが完了する。

新たに作成されたGemfileをインストールする。
```
docker-compose build
```

このまま起動しても、docker上のDBに接続できないため設定を変更する。
```diff_yaml:config/database.yml
~~略~~
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
+ host: db #dockerのDBのサービス名
+ username: dev #ユーザー名 (POSTGRES_USER)
+ password: dev #パスワード (POSTGRES_PASSWORD)
~~略~~
```

production環境のDBを作成する。
```docker
docker-compose run --rm web rails db:create
```

# コンテナを立ち上げる
```docker
docker-compose up -d
```
[localhost:3000](http://localhost:3000/)にアクセスして以下の画面が表示されると成功。
![2023-12-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2892903/de75facf-3144-e030-b5ca-6bae6fd04269.png)
停止する場合は以下のコマンド
```docker
docker-compose stop
```
# その他Rails操作関連のコマンドメモ
**起動してない状態のコンテナで操作を行う**
```docker
docker-compose run --rm web 実行したいコマンド
docker-compose run --rm web rails g model user
docker-compose run --rm web rails db:migrate
```
**起動中のコンテナで操作を行う**
```docker
docker-compose exec web 実行したいコマンド
docker-compose exec web rails g class user
```
**新しいgemをインストールする**
```docker
docker-compose build
```

# おわりに
以上の手順通りに行えばWSLのlinux上で普段と同じ環境で開発が行えると思います。
なにかの参考になればと思います。
AWSへのデプロイについての記事がAmazon linux 2023を利用するとMySQLが無いことでつまづいたことなどもあったのでまた記事にまとめれたらなんて考えています。

拙い記事だったと思いますが、ここまで読んでいただきありがとうございました。