DockerでRuby on Railsの環境構築をした

# 筆者の状態
プログラミング歴 4ヶ月ほど
HTML,CSS,Javascript,Typescript,Vue.js,React.jsなどの言語を勉強中の大学生。
インターンでTypescriptとVue.jsをやっている。
バックエンドは少しPHPとデータベースのMysqlを操作したことがある程度。ProgateでRubyの基本的な文法は押さえていざ実践的な学習へと進んだところ
Macbook Air
Apple M1
# きっかけ
https://railstutorial.jp/

上記のサイトでRuby on Railsの学習を進めていたところCloud9による環境構築が推奨されていた。
#### Cloud9
Cloud９とはクラウド統合開発環境というものでWebブラウザ上でデータベースからエディタ、ターミナルまで全て動かすことができる。環境開発も容易なので初心者にとって非常に使いやすい。

https://aws.amazon.com/jp/cloud9/

利用にはAWSアカウントが必要のこと

#####実際に利用した 
インターンや普段のフロントエンドの学習では、iTerm2(ターミナル),VisualstudioCode（エディタ）,Docker(*直接使用してないが、インターン等でコンテナの立ち上げなどは使用していた）ため、操作に慣れていたのでCloud9は使いずらかった。web上で操作している感じがあまり好きじゃなかった。
Dockerで環境構築することを決意した。

#やり方
一から環境構築するのは難しいと思ったのでYoutubeなどを参考にしながら環境構築をすることにした。
https://youtu.be/Fq1PH0Gwi8I

参考にしたYoutube、非常にわかりやすくコピペするだけで環境構築することができる。

https://hackmd.io/zwyIKkGXQbqQ7g2bDXsWZQ

上記のリンクに使用するDockerfileとdocker-compose.ymlのコードが記載されている。動画内でしか紹介されていないGemfileやコマンドもあるので注意。
####しかし、実際のところはコピペだけでは上手く動作しなかった...

環境構築がコードを記述するよりも難しいと言われるのを身をもって感じた。
動画内にある最初のコマンド（コマンドの意味は正直わかっていないがimageを作るものなんだろうと認識）

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

### 1つ目のError
そうすると以下のようなerrorが出た

```
docker: no matching manifest for linux/arm64/v8 in the manifest list entries.
```
日本語訳しても意味がよくわからなかったのでerrorメッセージをそのままググることにすると以下の記事が出てきた。

https://ryotarch.com/docker/no-matching-manifest-for-linux-arm64-v8-on-m1-mac/

どうやらM１Mac特有のerrorらしいのでM1Macじゃない人は出ないらしい。M1Macは何かとErrorが多いらしい...動作すごく早くて快適だけど

> docker-compose.yml

```
version: '3'

services:
    db:
        platform: linux/x86_64 //M1チップの対応
        image: mysql:5.7
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql

    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"
        volumes:
            - .:/myapp
            - gem_data:/usr/local/bundle
        ports:
            - 3001:3001
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:
~~~

上の記事のように新たにplatformを加えた、インターン先でlocalhost:3000は使っているのでなんとなく被らないように3001に変更したけど気にしないでください。

動画の内容を見ながら進めていたところ次は

```
$ docker-compose build
$ docker-compose up
```

```
Could not find gem ‘mysql2 (>= 0.4.4, < 0.6.0)’ in any of the gem sources listed in your Gemfile.
```

### 2つ目のError
このようなerrorが出た Gemfileが悪いのかな〜とか思いながら、とりあえずググることに...そうすると同じように動画を参考にしながら環境構築している人の記事が出てきた。

https://qiita.com/satto0303/items/c135c2279a1646921fc2

4時間も悪戦苦闘されたそうです...すごくありがたい。

```
$ docker-compose run web bundle install
$ docker-compose up
```
この記事のように異常のコマンドを実行すると無事コンテナが立ち上がりました。gemをvolumeで管理する場合は必要だということ....

よし、ローカルホスト見に行くぞと意気揚々にlocalhost:3001を立ち上げると

### 3つ目のError
>Mysql2::Error::ConnectionError
>Unknown MySQL server host 'db' (-2)

との表示。動画内だとデータベースがありませんてきなErrorが表示されてデータベースを作るながれになるんだけど...そのまま動画内のコマンド

```
$ docker-compose run web rails db:create
```
を実行。そうするとさっきの似たようなerrorが

```
rails aborted! Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
```

https://milkywayy.com/2019/12/27/%E3%80%90docker%E3%80%91unknown-mysql-server-host-db-2-%E3%81%A8%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/

例のごとくググるとこのような記事を発見。この記事のように進めていったが今度は上手くいかなかった。他の記事も参考にしたりしてみたが 
##### 全然上手くいかない
お手上げかと思っていたところ　そういえばdockerにはデスクトップアプリがあってそこから直接コンテナの様子を見に行けることに気づいた。

```
MYSQL_USER="root", MYSQL_PASSWORD cannot be used for the root user
    Use one of the following to control the root user password:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD
```
以上のようなerrorがdbコンテナ内で発生していた。 MySQL_USER='root'の部分を消せとのこと...（本来のerror文は少し違っていたかも。。すみませんerror内容とるの忘れてました...)

> docker-compose.yml

```
version: '3'

services:
    db:
        platform: linux/x86_64 //M1チップの対応
        image: mysql:5.7
        environment:
            MYSQL_ROOT_PASSWORD: password //ここの上に書かれていた内容を消した
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql

    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'"
        volumes:
            - .:/myapp
            - gem_data:/usr/local/bundle
        ports:
            - 3001:3001
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:
~~~

変更を加えた際は

```
$ docker-compose build
```

が必要のことなのでコマンドを実行し

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

データベースを作成した

localhost:3001にアクセスすると
![スクリーンショット 2021-11-05 19.13.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980538/0e9d54a8-2b5c-30cf-b23d-48aca7d4b091.png)
のように表示されました！！！！

# まとめ
環境構築が難しいと言われるのは人によってPCの環境が異なるから、それに伴ってerrorなどが起きたり起きなかったりするのだと思った。また、紹介されている環境構築の仕方も最新であるとは限らないのでdockerの更新や使用言語のアップデートがあるとそれだけでもerrorが起きたりするのだと思う。そんな時にも慌てず、しっかりとerrorログを読み、訳し、ググるなどして解決する力が必要なのだと思う。
この記事を見てRuby on Rails　の環境構築が難しいと思っている人の助けになればと思う。2021年11/５に環境構築をしたので割とerrorで詰まりそうなところは押さえているのではないかなと思う。あと、少しでも役に立ったらLGTMしていってください:blush: