#1.これからDocker導入します、という方は、まず、こちらを見ていただけると幸いです。
①Dockerを初めて導入して基本操作する (2020.4時点)
##前回までのおさらい
②Dockerを初めて導入してRails sする (2020.4時点)
当方、デモデータの投入については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)します
(アプリファイルを置いている場所はみなさん違いますので参考です)
% cd nomadcafe
Docker ps で起動しているコンテナを調べます。
docker ps
するとこんな感じになります。
webコンテナとdbコンテナ両方とも STATUS ”Up” になっています。
Dockerのdbコンテナの中に入っていきます。
docker exec -i -t [コンテナID] bash (カッコは要りません)
dbコンテナのIDを入力します。
docker exec -i -t ed494a77942a bash
root@ed494a77942a:/# ←これが出てきたら、dbコンテナに入った状態です。
MYSQLにアクセスします。
mysql -u root -p
MYSQLの中のデータベースを一覧表示します。
mysql> show databases;
こんな感じです。
Mysqlやアプリのdevelopmentやtestがありました!
データベースのうち、nomadcafe_development にアクセスします。
mysql> use nomadcafe_development
Database changed が出ればOKです。
nomadcafe_development のテーブルを一覧表示します。
mysql> SHOW TABLES;
こんな感じです。
Docker MYSQLイメージにマイグレーションしたテーブルがちゃんと存在していました!
#4.Docker環境で、Railsコマンド「rake db:seed_fu」でデモデータを投入する
当方のアプリは、多めのデモデータを投入しておく必要があり「db:seed_fu」を使用しています。
docker-compose.yml にrailsコマンド実行を記述します。
command: bash -c "bundle exec rake db:seed_fu && /bin/bash"
このへんに書いておきます。(rails sより下に書いたらうまくいきませんでした。)
この方法が妥当かどうか、正直、理解度が足りずわかりませんが、後々わかれば是正してきます。
docker-compose up --build します。
docker-compose up --build
localhost:3000にアクセスします。
無事、each文のボタン表示、dbデータ取得表示ができています。
Showページのdbデータ取得表示もできています。
#5.コンテナのMYSQLにデモデータ投入ができているか確認する
ブラウザでできていることは分かったのですが、念のためdbコンテナのMYSQLを確認します。
docker ps
コンテナIDを調べます。dbコンテナは 794f16c1d24d になります。
dbコンテナに入ります。
docker exec -it 794f16c1d24d bash
dbコンテナのMYSQLにアクセスします。
mysql -u root -p
mysql> show databases;
アプリ”nomadcafe_development”のデータベースにアクセスします。
mysql> use nomadcafe_development
Database changed が出たらOKです。
テーブルを一覧表示します。
mysql> SHOW TABLES;
shopsテーブルの中を確認します。
mysql> SELECT * FROM shops;
ですが、日本語が?で表示されてわからない状態になっています。(汗)
ブラウザでは問題なかったので、MYSQL表示の設定ではないかと思われます。
#6.DockerのMYSQLイメージを日本語化する
DockerのMYSQL設定を確認します。
mysql> status
こんな感じです。
latin1とあります、utf8に変えて日本語設定します。
###ローカルで「my.cof」ファイルを新規作成し日本語設定の記述をします。
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
こんな感じです。
続いて、docker-compose.ymlファイルの、db、volumesを編集します。
ローカルのmy.cnfファイルを DockerのMYSQLイメージの /etc/mysql/conf.d/my.cnfディレクトにマウント(同期)します、という記述です。
db:
image: mysql:5.6
volumes:
- ./my.cnf:/etc/mysql/conf.d/my.cnf ←追記します
docker-compose up --build
dbコンテナのMYSQLに入り、データベースのテーブルを確認します。
(同じ手順ですのでコマンドのみ書きます)
docker ps
docker exec -i -t CONTAINER ID bash
mysql -u root -p
use nomadcafe_development
SELECT * FROM shops;
ちなみに、
SequelProでDockerコンテナのMYSQLイメージに接続すると、簡単にテーブルを確認したり操作できます!
#7.SequelProでDocker MYSQLイメージに接続する
Docker-compose.ymlファイルの設定を見ておきます。
SequelProを開きアクセスするための入力をします。
・ホストは 「127.0.0.1」 にします
・ユーザー名は 「root」 にしています
・パスワードは 「Docker-compose.ymlで書いたパスワード 」 です
・ポートは 「4306 Docker-compose.ymlで書いた 左側のポート番号」 です
こんな感じです。
すると、このようにデータベースにアクセスできます!
#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.時点)
⑤AWS仮想サーバを利用する、AWSアカウント作成 + EC2インスタンス作成(2020.4時点)
こちらも続けて見ていただけると流れがわかると思います。