Ruby on Rails7.0.3 × MySQL8.0 のDocker環境構築

おはよう。:relaxed: 
色々あってRuby on Railsに入門するので、環境づくりをしたよ。


## Ruby on Railsって何？ :thinking:
Webアプリケーション開発フレームワーク。
特徴的だと思ったのは「最善の開発方法は1つ」という信念のもと設計されているところで、手法を学び、手法に則ることで生産性向上につながるとのこと。

哲学2つ
・Don't Repeat Yourself: DRY
 - 同じ意味や機能を持つ情報を複数に重複しておくことは避けましょうの考え方。
・Convention Over Configuration
 - 規約>設定:Rails側で既にWebアプリケーションの「最善の方法」を明確にし、各種設定にもデフォルト値を設定している。アプリケーションが迷走することを避けるために、規約の遵守を推奨しているらしい。

## 今回用意する環境 

今回はRailsの現時点最新バージョン7を使用したいので、Rubyも公式推奨の3.0で設定するよ。
Ruby: 3.1 
*https://hub.docker.com/_/ruby
Rails: 7.0.3
MySQL: 8.0

## 環境構築手順
### 1.必要なファイルを用意
railsの環境を作るのに日等ようなファイルは下記の四つ。

1.Dockerfile・・Dockerイメージを作成するための手順ファイル。
2.docker-compose.yml・・複数コンテナを定義して実行するため設定ファイル。
+
(Rails独自のファイル)
3.Gemfile ・・　使用するgem一覧が書かれたファイル。
4.Gemfile.lock・・Gemfileでインストールしたgemのバージョンなどを記載するファイル。編集はしない。

gemとは、gem形式で作られたRubyの外部パッケージ(ライブラリ)のこと。
Ruby本体には標準ライブラリとしてRubyGemsが入っていて、これを使うことでgemのインストール等々ができる。
RubyGemsはpythonのpip的なやつだと理解:relaxed:
https://pikawaka.com/ruby/how-gem-works



#### Dockerfile


```dockerfile:Dockerfile
FROM ruby:3.1

WORKDIR /rails_mysql_pj

COPY Gemfile /rails_mysql_pj/Gemfile
COPY Gemfile.lock /rails_mysql_pj/Gemfile.lock

RUN bundle lock --add-platform ruby
RUN bundle lock --add-platform x86_64-linux

RUN bundle install
RUN bundle update

COPY . /rails_mysql_pj

```


#### docker-compose.yml

```yml:docker-compose.yml
version: '3.9'
services:
  web:
    build: .
    command: bash -c "rm -f rails_mysql_pj/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - '.:/rails_mysql_pj'
    ports:
      - '3000:3000'
    depends_on:
      - db
    tty: true
    stdin_open: true
    environment:
      MYSQL_PASSWORD: password
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    volumes:
      - './data:/var/lib/mysql'


```

#### Gemfile

```ruby:Gemfile
source 'https://rubygems.org'
gem 'rails', '~> 7.0', '>= 7.0.3'

```

#### Gemfile.lock
空で良いので下記のコマンドで作る。

```
touch Gemfile.lock
```



ファイル構成は下記の通り

![スクリーンショット 2022-05-29 21.12.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/74377aca-2a63-67bb-cc31-48bf055a65ca.png)

---

### 2.railsのプロジェクトを作る

```
docker-compose run --no-deps web rails new . --force --database=mysql --skip-bundle
```

【rails newのオプションの説明】
**-force** : ファイルが存在する場合に上書き
**–database** : データベースの種類(デフォルト：sqlite3なので、それ以外の時は指定する。)
**–skip-bundle** : bundle installしない	



ポイントは、 --skip-bundleを指定すること！
このタイミングではGemfileに記載された内容を読み込ませたくない(=この後、Gemfileが更新されるので、その後読み込ませたい)ので、一旦スキップする。



このコマンドが完了すると、ローカルに下記のようなファイル(railsのアプリ開発に必要なもの)が作成される。
![スクリーンショット 2022-05-29 21.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/f8ac065b-56e7-fe12-d2ab-385dc2b75e9a.png)

また Gemfileも更新される。
![スクリーンショット 2022-06-05 21.48.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/a60012e5-e107-229e-a132-ebe648a1bc90.png)


---

#### 3. config/database.ymlの編集
デフォルトから画像の部分を修正し、docker上の設定に合わせる。

![スクリーンショット 2022-05-29 21.27.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/1de292c5-8ccb-ca8c-001c-0af8b94bcbf9.png)

---

####  4.ビルド

```
docker-compose build
```
![スクリーンショット 2022-05-29 21.39.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/54d6e993-a465-509b-21a2-b3e703a04506.png)

エラーがなく進んだらOK

---

#### 5.mysqlのDBを作成する

```
docker-compose run web rails db:create
```

![スクリーンショット 2022-05-29 21.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/a686fc5e-9c7c-c1c2-2547-4694343c80f8.png)

３.で編集したconfigファイルに沿ってDBが構築される


---

#### 6.起動する
ここまで準備ができたら、やっと全部を起動するよ:relaxed:

```
docker-compose up
```



![スクリーンショット 2022-05-29 21.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482103/ed401b60-1263-7843-c8d8-f58d727d4438.png)

こんな感じでログが出て、http://0.0.0.0:3000/ にアクセスできればOK！

次は今回の環境を使って何か作ってみるよ:relaxed:


----

### 参考にさせていただいたサイト
[公式]
https://railsguides.jp/
https://railsdoc.com/rails


https://alterbo.jp/blog/ryu3-2106/
http://www.code-magagine.com/?p=8808