OrbstackでDockerのコンテナを起動してMySQLに接続する


# はじめに
業務の中で、今まではDocker for Desctopを使用していた。
不便は感じなかったものの、Docker for Desctopの悪い点をカバーしてくれると聞いて使用してみることにしました。今回はdockerでmysqlの環境構築を例に説明します。

# 目次
- 使用するもの・環境
- OrbStackのインストール方法
- MySQLを例に実際に起動してみる

# 使用するもの
・Orbstack(docker-composeを使用)
・MySQlイメージ(ver.5.7)

# 環境

・Mac
・Visual Stagio Code


# Orbstackをインストール

brewを使ってインストール
```
brew install orbstack
```
今回はbrewでインストールしましたが、下記のサイトにてダウンロードすることも可能です。

https://orbstack.dev/blog/orbstack-1.0

# MySQLを例に実際に起動してみる
### ディレクトリの構造
![スクリーンショット 2024-01-11 15.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/d5f601dd-a55b-3b1a-6d2b-e5f850a45d5f.png)
画像のようなディレクトリの構造になっています。

### docker-composeの中身
![スクリーンショット 2024-01-09 23.12.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/df2c40ea-63e7-447b-517f-e1e3890ea3d8.png)

公式ドキュメントを参考に作成しました。他にも設定できる項目があるのでチェックしてみてください。
https://hub.docker.com/_/mysql

volumesは任意の名前をつけています。

### dockerfile
dockerイメージ、MySQL設定ファイルの読み込みを指定しています。

![スクリーンショット 2024-01-09 23.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/b3004837-8421-8538-4035-351ae61cf0be.png)

今回は前述したように5.7を使用しています。

### my.cnf
MySQLの文字コードの設定です。

![スクリーンショット 2024-01-09 23.40.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/6cd6a7cf-d34c-285a-bb01-037b041c7111.png)

### user.sql
初期値として作成するテーブルとDBをsqlで記述しています。

![スクリーンショット 2024-01-09 23.50.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/6039ac86-65ac-d9d4-c2b6-af54ad350813.png)

### docker-composeの起動
コマンドは特に変化はないので通常のdockerのコマンドを使用して起動します。

```
docker-compose build
```
コンテナを起動します。こちらもコマンドに変化はありません。
```
docker compose up
```
バックラウンドで実行する際はup の後ろに-dをつけてください。
```
docker compose up -d
```
画像はバックラウンド実行せずに起動した時のものです。

![スクリーンショット 2024-01-11 11.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/184d062d-e326-6bb5-9c73-e4244960dceb.png)

この時点でのorbstackは、コンテナが起動している状態です。起動しているかどうかの基準としては、停止ボンタンが表示されていれば起動しています。こちらから起動・停止することも可能です。

![スクリーンショット 2024-01-11 11.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/85eb464b-282f-897a-7178-a498d66dc221.png)

### MySQLにアクセス

dockerが立ち上がったのでMySQLにアクセスします。
アクセス方法として、コンテナからMySQLに接続します。
その際に、コンテナIDが必要になります。
余談になりますが、コンテナIDを確認する方法について軽く説明します。

コンテナIDを確認する手法として、２種類あります。
#### 作成したコンテナの情報を確認して、コンテナIDを取得する方法
```
docker ps
```
#### OrbStackのコンテナメニューから確認する方法
下記のように赤丸で囲んだ部分を選択します。
![スクリーンショット 2024-01-11 11.40.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/2baacddc-1d34-008d-a407-864ebf9b3d17.png)

選択すると下記のように詳細情報が表示され、赤丸で囲んだ部分がコンテナIDです。
![スクリーンショット 2024-01-11 11.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/ce7bb47d-a60e-c8e8-5c29-9051900ca363.png)

個人の好みですが、個人的に後者のOrbStackでのID取得がおすすめです。コマンドを打ち込まずに簡単にコピーできるためです。

コンテナIDが取得できたら、下記のコマンドを実行してコンテナに接続します。
```
docker exec -it [コンテナID] bash
```
続いて、コンテナ内のMySQLに接続します。接続できるとパスワードを聞かれるので、docker-compose.ymlで設定したパスワードを入力してください。
```
mysql -u root -p
```
このように表示されれば無事アクセスできています。
![スクリーンショット 2024-01-11 11.55.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/4223df04-4c20-882f-0856-8fd3ef089bce.png)

テーブルが作成されているか確認します。
```
show databases ;
```
赤丸で囲んだ部分が初期のデータベースです。
青丸で囲んだ部分がusers.sqlで作成したテーブルです。

![スクリーンショット 2024-01-11 11.57.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/53347a22-d2d4-9bc6-f0e1-f5f393f944f9.png)

下記のコマンドを実行するとテーブルの中身を実際に確認できます。
```
use testQl;
```
![スクリーンショット 2024-01-11 12.01.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/42ba9b15-e13f-6b91-d452-7be6afc9e437.png)

テーブルの中身をSQLクエリを実行して確認します。
![スクリーンショット 2024-01-11 12.05.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070175/55b9b4eb-01ae-45ad-3487-efb7740cb251.png)
無事にデータが投入されています。

終了する際も特に変更点はありません。
```
docker compose stop
```

MySQLデータを初期化したい場合などはコンテナを削除してください。こちらもコマンドの変更はありません。
```
docker compose down
```
# まとめ
以上がOrbStackでコンテナを作成・起動してみました。
個人的には、コンテナのIDの確認がしやすい点であったり、今回は触れませんでしたが、volumesで保存されているデータの確認がfinderでできるという利点があり、使いやすいのではないかと思います。