Docker  rails mysqlで環境構築！

５／14追記  railsのバージョンをGemfileで指定する方法を追加しました。


今回はDockerにrails、MySQLの環境構築を行いました。
 
##Dockerはdocker-for-macを使用しています

・Docker version 19.03.8
・ruby   version 2.5.3
・rails  version 5.2.4.2
・MySQL  version 8.0.13

こちらの環境を構築していきます。

###１、まずはディレクトリを作成します
今回はDockerディレクトリを作成し
その中にsampleディレクトリを作成しました。

**sampleはアプリの名前になります。**

こんな感じ↓

```
% pwd
/Users/hoge/Docker/sample
```
###２、コードエディターを開きます

sampleディレクトリに入り
・Dockerfile
・docker-compose.yml
を作成します。

```:ターミナル
sample % ls
Dockerfile  docker-compose.yml
```
こんな感じになってると思います。↑

##３、Dockerfileに記述をしていきましょう！
```ruby:Dockerfile

FROM ruby:2.5.3                           
#rubyのバージョン指定
RUN gem install rails
#gemのインストール
RUN apt-get update && apt-get install -y nodejs mysql-client
#パッケージのアップデート　インストール

```
##４、docker-compose.ymlに記述していきましょう！

```ruby:docker-compose.yml
version: '3'
services:           
  mysql:           #コンテナの名前(なんでもok)
    image: mysql:8.0.13
    command: --default-authentication-plugin=mysql_native_password 
                   #MySQL -v8.0から認証方式が変更されたので、mysql -v5.0に合わせるプラグイン
    volumes:  
      - "./mysql-data:/var/lib/mysql"  
                   #ローカルのmysql-dateにデータを保存する（コンテナが消えてもデータが残る）
    environment:
      MYSQL_ROOT_PASSWORD: root



  app:               #コンテナの名前(なんでもok)
    build: .         #Dockefileを指定
    volumes:         #dockerコンテナ内のファイルをローカルで編集する為の記述
      - ".:/app"
    ports:           #localhost:3000にアクセスすると、コンテナ内の3000ポートにアクセスする
      - "3000:3000"
    tty: true
    depends_on: 
      - mysql        #mysqlコンテナにアクセスする
    working_dir: "/app" #コンテナに入った時に直接appディレクトリに入る
    


```
##５、Dockerを起動しましょう！
```:ターミナル
sample % docker-compose up
Creating network "sample_default" with the default driver
Creating sample_mysql_1 ... done
Creating sample_app_1   ... done

```
こんな感じになっていると思います。
dockerがインストールされていれば、dockerが立ち上がるはずです。
sampleとmysqlのコンテナが作られているのが分かると
思います。


##６、コンテナに入っていきましょう！
ターミナルで
（command＋T）で別タブを開きましょう。

```:ターミナル
sample % docker exec -it sample_app_1 /bin/bash
root@*********:/app# pwd
/app
```
コンテナに入れたら、/appディレクトリに居てるのがわかります。

##７、rails newをしていきましょう！

今回は、railsのバージョンを指定したいので、指定できるバージョンを確認しましょう。

```:ターミナル

root@*********:/app# gem list rails

*** LOCAL GEMS ***

rails (6.0.3)
```

今回はrails (5.2)系を使用します。
該当するバージョンが無いのでインストールしましょう。

```:ターミナル

root@*********:/app#　gem i -v 5.2.0 rails

```

インストールが出来たら、確認してみましょう。

```:ターミナル

root@*********:/app# gem list rails

*** LOCAL GEMS ***

rails (6.0.3, 5.2.0)
```
インストールが確認出来たと思います。

それでは、バージョンを指定してrails newをして行きましょう！

```:ターミナル

root@*********:/app#　rails _5.2.0_ new .

```
これで、sampleディレクトリにrailsのファイル類が出来たと思います。

```:ターミナル
root@*********:/app# ls                
Dockerfile  Gemfile.lock  Rakefile  bin     config.ru  docker-compose.yml  log	       package.json  storage  tmp
Gemfile     README.md	  app	    config  db	       lib		   mysql-data  public	     test     vendor

```
このままbundle installして行きましょう

```:ターミナル

root@*********:/app#　bundle install

```

ここまで来れればもう少し！

##８、rails serverを立ち上げましょう！

```:ターミナル

root@*********:/app#　rails s -b 0.0.0.0

```
rails serverが立ち上がれば、いつも通り
**localhost:3000**
で確認してみましょう！
![スクリーンショット 2020-05-13 2.23.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635622/d579a06f-b4ad-ef69-3870-e1cbd94c7035.png)

こうなればOKですね！

##８、MySQLの設定をして行きましょう！
まずはGemfileを編集しましょう！
(sqlite3)になっているので,(mysql2)
に書き換えましょう！

```ruby:Gemfile

gem 'sqlite3' <-削除します
gem 'mysql2'

```

書き換えたらbundle install

```:ターミナル

root@*********:/app#　bundle install

```

##９、database.ymlを編集しよう！
```ruby
:database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  username: root
  password: root
  host: mysql
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: rails_app_development


test:
  <<: *default
  database: rails_app_test

production:
  <<: *default
  database: rails_app_production


```

編集が出来れば、DBを作成します！

```:ターミナル

root@*********:/app# rails db:create

```

##１０、mysqlに入って確認してみましょう！

```:ターミナル

root@*********:/app# mysql -u root -proot -h mysql

MySQL [(none)]> show datebases;

+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
| mysql                 |
| performance_schema    |
| sample_development 　 |
| sample_test         　|
| sys                   |
+-----------------------+

```

こんな感じになっていればOKです！


お疲れ様でした！
ここからはいつも通り、開発を進めて行けばOKです。:relaxed:

 Docker環境構築の方法は色々ありますが。
個人的にはこの方法が理解しやすかったので。
記事にしてみました。

docker hubにimageがあるので
好きな、バージョンを集めて環境構築をしてみて下さい。

https://hub.docker.com/

間違いなどあれば、指摘していただけると幸いです:smile:



##追記  railsのバージョンをGemfileで指定する方法

・Dockerfile
・docker-compose.yml（上記と同じ）

を作成し、そのまま

・Gemfile
・Gemfile.lock
を作成します。

###Dockerfileを編集

```ruby:Dockerfile

FROM ruby:2.5.3                         
#rubyのバージョン指定
RUN gem install rails
#gemのインストール
RUN apt-get update && apt-get install -y nodejs mysql-client
#パッケージのアップデート　インストール

COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock
#ローカルのファイルをコンテナにコピー
RUN bundle install

```
###Gemfileを作成

```ruby:Gemfile

source 'https://rubygems.org'
gem 'rails', '~> 5.2.0'

```
###Gemfile.lockを作成

```ruby:Gemfile.lock
#記述は不要

```
###Dockerの起動

```:ターミナル
sample % docker-compose up
```
###コンテナに入ります

```:ターミナル
sample % docker exec -it sample_app_1 /bin/bash
root@*********:/app# pwd
/app
```

###rails new
プロジェクトを指定して、rails new

```:ターミナル
root@*********:/app# bundle exec rails new . 
```

###必要であれば

```:ターミナル
root@*********:/app# bundle update
```
ここからは、同じですので。
８、rails serverを立ち上げる所から進めて下さい！



以上です:relaxed: