③Docker MYSQLにデモデータ(seed_fu)を投入する(2020.4時点)


#1.これからDocker導入します、という方は、まず、こちらを見ていただけると幸いです。

**[①Dockerを初めて導入して基本操作する (2020.4時点)](https://qiita.com/SakagamiKeisuke/items/4455631886b1c15a3b69)**

##前回までのおさらい　

**[②Dockerを初めて導入してRails sする (2020.4時点)](https://qiita.com/SakagamiKeisuke/items/d64ee54c22378223659a)**

当方、デモデータの投入についてはdb:seed_fuを使用しして開発しております。
Docker環境においてもMYSQLイメージ内にdb:seed_fuでデモデータを投入する作業を進めます。

#2.前提
Docker for Macアプリをインストールしている
Dockerサービスが起動している
DockerHubでサインインしている
VSCodeで編集
ターミナル使用
Sequelpro使用(なくてもなんとかなります)

<環境>
macOS : Catalina 10.15.3
Docker version : 19.03.8
ruby : 2.5.1
Rails : 5.2.4.1
MYSQL :5.6

#3.DockerコンテナのMYSQLイメージが稼働しているか確認する

”docker-compose up している状態”を保持しつつ、
別ウインドウで新しいターミナルを開いて ローカルのアプリディレクトリに移動(cd)します
(アプリファイルを置いている場所はみなさん違いますので参考です）


```ruby:ターミナル 
 % cd nomadcafe  
```
Docker ps で起動しているコンテナを調べます。


```ruby:ターミナル
docker ps
```
するとこんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/1ff63a5f-7131-0898-e4a4-b6e81d501658.png)
webコンテナとdbコンテナ両方とも STATUS ”Up” になっています。

Dockerのdbコンテナの中に入っていきます。

```ruby:ターミナル 
docker exec -i -t [コンテナID] bash  (カッコは要りません)
```
dbコンテナのIDを入力します。

```ruby:ターミナル 
 docker exec -i -t ed494a77942a bash
```
 root@ed494a77942a:/#　←これが出てきたら、dbコンテナに入った状態です。

MYSQLにアクセスします。

```ruby:ターミナル 
mysql -u root -p
```

MYSQLの中のデータベースを一覧表示します。

```ruby:ターミナル 
mysql> show databases;
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/ac89e3e1-adb3-7657-9ce5-f403d5a0995c.png)
Mysqlやアプリのdevelopmentやtestがありました！

データベースのうち、nomadcafe_development にアクセスします。

```ruby:ターミナル 
mysql> use nomadcafe_development
```
Database changed　が出ればOKです。

nomadcafe_development のテーブルを一覧表示します。

```ruby:ターミナル 
mysql> SHOW TABLES;
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/a9f0976a-6573-f3a3-820e-25ff890ffd3a.png)
Docker MYSQLイメージにマイグレーションしたテーブルがちゃんと存在していました！

#4.Docker環境で、Railsコマンド「rake db:seed_fu」でデモデータを投入する

当方のアプリは、多めのデモデータを投入しておく必要があり「db:seed_fu」を使用しています。


docker-compose.yml にrailsコマンド実行を記述します。


```ruby:docker-compose.yml
    command: bash -c "bundle exec rake db:seed_fu && /bin/bash"
```
このへんに書いておきます。（rails sより下に書いたらうまくいきませんでした。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/7fc66d68-ae6b-85c6-0290-eaedd91cb74e.png)
この方法が妥当かどうか、正直、理解度が足りずわかりませんが、後々わかれば是正してきます。



docker-compose up --build します。

```ruby:ターミナル 
docker-compose up --build            
```

localhost:3000にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/05aa2f7d-556f-b69c-7b6a-8ab416570ec3.png)
無事、each文のボタン表示、dbデータ取得表示ができています。
Showページのdbデータ取得表示もできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/eaf262aa-ad74-5744-d54f-204d14bcf0d2.png)

#5.コンテナのMYSQLにデモデータ投入ができているか確認する

ブラウザでできていることは分かったのですが、念のためdbコンテナのMYSQLを確認します。

```ruby:ターミナル 
docker ps
```
コンテナIDを調べます。dbコンテナは 794f16c1d24d になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/41f1f084-9b28-c567-4016-7cb5e021ca3b.png)
dbコンテナに入ります。

```ruby:ターミナル 
docker exec -it 794f16c1d24d bash
```

dbコンテナのMYSQLにアクセスします。

```ruby:ターミナル 
mysql -u root -p
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/e00a8689-d113-fc93-86bb-02016a3ded07.png)
データベースを一覧表示します。

```ruby:ターミナル
mysql> show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/816ab36c-8bbf-f62a-7b48-7bc1599188d8.png)
アプリ”nomadcafe_development”のデータベースにアクセスします。

```ruby:ターミナル
mysql> use nomadcafe_development
```
Database changed　が出たらOKです。

テーブルを一覧表示します。

```ruby:ターミナル
mysql> SHOW TABLES;
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/b862cec7-7c95-4c6c-0992-05bdd7cf6d90.png)

shopsテーブルの中を確認します。

```ruby:ターミナル
mysql> SELECT * FROM shops;  
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/9ddc9a57-ce3d-e05b-c0c3-96f4902323f0.png)
無事、shopテーブルにデモデータが投入されていました!

ですが、日本語が？で表示されてわからない状態になっています。（汗）
ブラウザでは問題なかったので、MYSQL表示の設定ではないかと思われます。

#6.DockerのMYSQLイメージを日本語化する

DockerのMYSQL設定を確認します。

```ruby:ターミナル
mysql> status
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/889b7862-3556-820b-0599-e1d5e6faeae5.png)
latin1とあります、utf8に変えて日本語設定します。


###ローカルで「my.cof」ファイルを新規作成し日本語設定の記述をします。

```ruby:my.conf
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[client]
default-character-set=utf8
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/6f07ca31-5646-fc66-4e84-a9dff213ad03.png)
続いて、docker-compose.ymlファイルの、db、volumesを編集します。

ローカルのmy.cnfファイルを DockerのMYSQLイメージの /etc/mysql/conf.d/my.cnfディレクトにマウント（同期）します、という記述です。

```ruby:docker-compose.yml

  db:
    image: mysql:5.6
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf    ←追記します
```
こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/ff7642e5-be41-189c-57de-15a2bf841bee.png)
改めて、起動します。

```ruby:ターミナル 
docker-compose up --build
```


dbコンテナのMYSQLに入り、データベースのテーブルを確認します。
（同じ手順ですのでコマンドのみ書きます）

```ruby:ターミナル 
docker ps

docker exec -i -t CONTAINER ID bash

 mysql -u root -p

use nomadcafe_development

 SELECT * FROM shops;   
```

無事、日本語表示が成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/762fa3b0-b83b-060c-7842-ae8a4af63ef4.png)

ちなみに、
SequelProでDockerコンテナのMYSQLイメージに接続すると、簡単にテーブルを確認したり操作できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/237f4c9a-2585-6dc9-124b-23009d6a9c4b.png)


#7.SequelProでDocker MYSQLイメージに接続する

Docker-compose.ymlファイルの設定を見ておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/14462e56-3272-d49c-5bb8-1602ddfdcaa6.png)

SequelProを開きアクセスするための入力をします。
**・ホストは 「127.0.0.1」　にします**
**・ユーザー名は　「root」　にしています**
**・パスワードは　「Docker-compose.ymlで書いたパスワード　」　です**
**・ポートは　「4306　Docker-compose.ymlで書いた 左側のポート番号」　です**

こんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/3e10f112-9c96-5da2-0212-cbf231fdfa49.png)
すると、このようにデータベースにアクセスできます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/f8241a86-70da-6703-df01-044661e352d6.png)


#8.参考になった記事一覧です。（ありがとうございす！）
【MySQL, SQL】データベースを扱う基本SQL一覧https://qiita.com/knife0125/items/bb095a85d1a5d3c8f706
コマンドはdocker-compose.ymlとDockerfileのどちらで定義するほうがいい？
docker-compose.ymlの書き方について解説してみたhttps://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04
【Rails seedsでdocker起動時に初期データを登録する 。データの重複はfirst_or_createで防ぐ】https://qiita.com/clbcl226/items/a6efd9035e0141251cf1
【Docker】Dockerでホストのディレクトリをマウントするhttps://qiita.com/Yarimizu14/items/52f4859027165a805630
Dockerで立ち上げたMySQLにログインすると日本語が文字化けhttps://qiita.com/luccafort/items/0553c589dcc6459746bc
DockerのMySQLコンテナにSequelProで接続するhttps://qiita.com/y_u_y_a/items/f30019316a1bd738437c


#9.最後に
当方、 実務未経験＋初学者＋テッ○キャンプ卒業＋転職活動中であります。
もし、間違い等ございましたらご教示いただけるとありがたいです。

たくさんの先輩方のQiita記事でコードを見合わせできたり、エラー解決記事があったおかげで、ここまで実装できました。 記事を投稿してくださった先輩方に感謝しております。

この先も本番環境でのdocker実装に向けて進みつつ、わかりやすい記事を寄稿していきたいと考えています

##ローカル・Dockerで開発環境を整えるまでの続編
**[④ローカルDocker環境でデータ永続化、entrypointでseed_fuをやり直しする(2020.4.時点)](https://qiita.com/SakagamiKeisuke/items/8d3fc70a2939cd4bbe3e)**
**[⑤AWS仮想サーバを利用する、AWSアカウント作成 + EC2インスタンス作成(2020.4時点)](https://qiita.com/SakagamiKeisuke/items/9568754f318edd53e39d)**
こちらも続けて見ていただけると流れがわかると思います。