ruby on railsをdocker環境で立ち上げてみる。

# はじめに

naritomoと申します。

本職はインフラエンジニアを行っています。
ruby系について、開発環境構築方法について投稿したいと思います。

いろいろアドバイスいただけると嬉しいです。

## 立ち上げ概要

windows11を使用してwsl2+Ubuntu+vscode+git環境を作り、
docker-composeを使用して立ち上げるものになります。

必要なソースは以下にまとめてあります。

https://github.com/naritomo08/railspostgres

## 参考URL
[Windows10のWSL2(Ubuntu)でDockerを使ったRails環境構築](https://qiita.com/na-777/items/fcccb48b4f3b549abe61)

[Elixirをdocker環境で立ち上げてみる。](https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102)

## なぜ、あえてDockerなのか？

インフラエンジニアとしてDockerから触れたほうが扱いやすく、
以下の利点を感じられたため、開発環境構築ではDockerを使用することを
推しています。

* OS問わず同じ開発環境での開発が可能
* インフラ/アプリエンジニアでのコラボがしやすい。
　 (具体的にはインフラ屋でOS/開発環境のベース環境を構築し、
　　アプリエンジニアで本来行うべき開発業務に集中できる。)
* 本番Web環境で多く使用されているAWS/AzureなどのIaaSサービス
　に対し、Docker資産を使用できる。

一応、本番環境展開にPaaSを使用する手はありますが、
AWS/Azureを絡めたほうが業務につながるとみています。

## 事前準備

windows11+wsl2+Ubuntu22+DockerCompose+vscode+gitでの環境を構築してること。

## 環境構築手順

### ベースリポジトリをクローンする。

```bash
rails6系の場合:
$ git clone https://github.com/naritomo08/railspostgres.git railspostgres
rails7系の場合:
$ git clone -b rails7 https://github.com/naritomo08/railspostgres.git railspostgres

$ cd railspostgres
* フォルダ名は変更してよい。
```

後にファイル編集などをして、git通知が煩わしいときは
作成したフォルダで以下のコマンドを入れる。

```bash
 rm -rf .git
```

### railsアプリの新規作成準備

```bash
$ mkdir src
$ cp Gemfile src/
$ cp Gemfile.lock src/
```
### rails newコマンドをrailpapp上で実行

```bash
$ docker-compose build
$ docker-compose run --no-deps railpapp rails new . --webpack --force --database=postgresql
```

### railsのディレクトリができているかチェック

```bash
$ ls -l src
→複数のファイル/フォルダができていること。
```

### 所有者がrootになっているファイルの所有者を現在のユーザに書き換え

*macではおこなわなくて良い。

```bash
$ sudo chown -R $USER:$USER .
```

### rails new で新しいGemfileができたので再ビルド

```bash
$ docker-compose build
```

### webpackerのインストール(rails6系でのみ実施)

```bash
$ docker-compose run railpapp rails webpacker:install
```

### DBの設定を変更

```bash
$ vi src/config/database.yml

以下の内容に上書きする。

default: &default
  adapter: postgresql
  encoding: unicode
  host: postgresdb
  username: postgres
  password: password
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: myapp_development

test:
  <<: *default
  database: myapp_test
 
production:
  <<: *default
  database: myapp_production
  username: myapp
  password: <%= ENV['MYAPP_DATABASE_PASSWORD'] %>
```

### コンテナ立ち上げ

```bash
$ docker-compose up -d
立ち上がっていないコンテナは不要なので消しておくこと。
コンテナ確認/削除方法は割愛。
```

### 下記のコマンドを実行してDBを作成

```bash
$ docker-compose exec railpapp bash
$ rake db:create
```

## ログインURL


### Rubyサイト

http://localhost:3000

### adminer(DB管理ツール)

http://127.0.0.1:8081

* ログイン情報
  - データベース種類: Postgresql
  - サーバ: postgresdb
  - ユーザ名: postgres
  - パスワード:password

mailhog(メールサーバ)

http://127.0.0.1:8025

## コンテナ起動

```bash
docker-compose up -d
```

## コンテナ停止

```bash
docker-compose stop
```

## コンテナ削除

```bash
docker-compose down
```

## 起動中のコンテナに入る

1. appコンテナ

```bash
$ docker-compose exec railpapp bash
```

2. DBコンテナ

```bash
$ docker-compose exec postgresdb bash
```
## Gemfileを更新した場合

以下のコマンドでコンテナ再ビルド/作り直しを行うこと。

```bash
docker-compose down
docker-compose build
docker-compose up -d
```

## 作成したソースを流用したい場合

サイト作成したあと、以下のフォルダ内をgithubなどに保管すれば、
他の開発/本番環境へソースを持っていって利用できます。

```bash
src
```

本docker環境に持っていきたい場合、ベースリポジトリをクローンしたあと、
上記フォルダに使用したいソースを入れて、
"Gemfileを更新した場合"を実施すればひとまず立ち上がるはずです。

他環境で本ソースを使用した立ち上げ方は、
ここでは割愛いたします。

# おわりに

合わせてmysql版のコンテナも作っていますので、
参照していただいて指摘をいただけると嬉しいです。

https://github.com/naritomo08/railsmysql

*rails6系ではmainブランチ、rails7系ではrails7ブランチを参照してください。

本記事以外にもElixir/phpについても同様のものを上げていますので、
参照していただいてこちらにも挑戦していただければと思います。

https://qiita.com/naritomo08/items/fecf4ace7b9ca9078102

https://qiita.com/naritomo08/items/a66f4647c13a6c4a920e