💿

docker上でSQLを使う方法まとめ

に公開

はじめに

IT系専門学校に通っているそこらの弱弱エンジニア志望のGadeetFreakだよ。「書き込み式SQLドリル」でSQL系の言語を学習してるんだけど、自主学習のために自分のマシンでMySQLを動かす時の備忘録的なもの。

本編

準備物

なぜodockerなのか?


できるだけ、開発環境をクリーンにしておきたいのと、何か不具合があってもコンテナごと消してまた新しい状態に簡単に戻せるからdockerのコンテナ上で実行する。dockerは、webアプリ開発などにも幅広く使えるから、この機会にもう一度使い方とかを覚える。dockerは、これまで仮想OSで行ってたことを「わざわざゲストOS上で実行するなんか効率悪いし、もっと移植性が高くできるワンセットになってすごいものはないんか...」っていう切実な思いから誕生した(多分ね)

dockerのインストール

何はともあれ、docker自体がないと使えないから早速インストール。Macの場合はhomebrewからインスストールすると、後々バージョン管理したりが楽。HomeBrewがよくわからない場合は、公式サイトからダウンロードする。画面をぽちぽち押していくだけだからそんなに難しくない
公式サイト
Homebrewでインストールする場合は以下をターミナルに記述する

% brew install --cask docker

起動するとこんな画面が表示される。ここからでも、GUIを使って視覚的にコンテナを管理することができる。英語だが見覚えのある単語が多いからそこまで難しくない。
docker desktop

docker-compose.yamkの作成

どこでもいいからまずはフォルダを作成。場所に関しては、「dev」みたいな名称のフォルダを作って意置いて、そこに作ったものとかをできるだけ1箇所にまとめるのがおすすめ。こうする子で、Finderからもターミナルからもフォルダにすぐアクセスすることができる。
.が最初に作成したフォルダ。./initの中には、各自で用意したデータベースを配置する。詳しいことは後述するから、まずはdocker-compose.ymlを作成する。

.
├── docker-compose.yml
├── init
│   ├── my.cnf
│   └── workbook.sql
└── initdb

ちょっと長くなったが、このフォルダはdockerのコンテナを作るための設定とか必要な情報をひとまとめにしたものだ。

  • コンテナの名前
  • バージョン
  • 使用するイメージ
  • MySQLのパスワード
  • DB名
  • ユーザ名
  • ポートの指定
    など、コンテナを構成する設定や情報(環境変数やボリューム指定)がこのファイルに詰まっている。逆に言えば、これを書くだけであとは実行すると必要なものはすべて揃ってしまう。そのため、非常に柔軟で移植性が高い。では実際に中身を解説する。
docker-compose
version: "3.9"
services:
  db:
    image: mysql:8.0    #SQLのバージョン
    container_name: mysql_study     #コンテナの名前
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword     # パスワード(起動時に必要になる)
      MYSQL_DATABASE: studydb       # 中のデータベースの名前
      MYSQL_USER: studyuser
      MYSQL_PASSWORD: studypassword
    ports:
      - "3306:3306"     # ポート番号のして
    volumes:
      - ./init:/docker-entrypoint-initdb.d   #intフォルダのデータベースを初回時読み込む
      - ./init/my.cnf:/etc/mysql/my.cnf # カスタム設定ファイルをマウント(文字化け防止)
      - mysql_data:/var/lib/mysql # dbを永続化するためのボリューム

volumes:
  mysql_data:

ここで注目するべきはvolmeのところ。最初に、initフォルダのデータベースを読み込んでいる。そのあと、my.cnfというデータベースの設定を記述したファイルを読み込むといった流れとなる。

initフォルダに必要なデータをインポート

さて、では必要なデータベースが入っているファイルをインポートする。my.cnfについては今は無視する。

早速dokcerを起動し実行するぞ

さて、早速コンテナとして起動させる。ターミナルに打ち込むだけですぐできるので簡単だ。よく使いそうなものを少し紹介。今実行するのは一番上だけ

コンテナ起動

docker compose up -d

コンテナを停止する場合

docker compose down

コンテナをデータごと削除する場合

docker compose down -v

DBに入る

docker exec -it <コンテナ名> sh -> zshの場合
docker exec -it <コンテナ名> bash -> bashの場合


データベースを指定

USE studydb

データベースを指定。これはどのSQLでもそうだけど一応忘れがちなので。

my.cnfに迫る

さあ、簡単なSQL分でテーブルの情報を出力するとわかるが、日本語の部分が文字化けしている。エディタでデータベースを開いてみてもUFT-8だし、ターミナルも基本的にはUFT-8のはずだ。それなのに文字化けする。なぜか?
ターミナルもデータベースのファイルもUfT-8なので基本的には文字化けしないはずだ(Unicodeなんで)
ggって見るとどうやら同じ状況に遭遇した方がZennで記事を書いていた。どうやら、MySQLの文字コードの設定が不完全だったようだ。まずは、以下をターミナルに貼って実行する

mysql> show variables like '%char%';

するとこうなるはずだ。

文字コードが混在していることが分かる。こりゃ文字化けしてもしゃーないな
そこで、最初に「my.cnfはとりあえず無視で」とサラッといっていたこのファイルが役にたつ。これは、SQLのフォントとかを設定してくれるファイルで、ここに文字コードを指定すればこの問題は解決するということだ。詳細はとても参考になった元記事のリンクを貼っておく
https://zenn.dev/otsuomami/articles/720c8e23429389

終わり

これで、快適にSQLについて学習する環境を構築することができた。そして、dockerや仮想化の概念を少しでも理解することができたなら、サーバーサイドの知識がより増えたことになる。「全く分からない」と最初は思うし、真っ暗な道を暗いランプのついた自転車で走ってるかのような感覚になることも多々ある。だだし、最初は誰もし同じだ。今もそのような感覚に陥るときはある。でも、続けるうちに分かるようになる。

Discussion