Dockerを使ってMySQLの環境構築【WSL2】

## はじめに
Webアプリケーション開発の初学者です。

Dockerのメリットは、気軽に環境をぽこぽことつくっては捨てられるところですので、
私のような初心者にもうってつけではないかと思いました。


## DockerDesktopをWindowsへインストールする方法

WSL2でDockerDesktopをはじめる方法は、[こちら](https://qiita.com/takegongon/items/969f12b80b9a957b8468)が簡潔でわかりやすく参考にさせていただきました。

[->参考:DockerDesktopをWindowsへインストールする手順を解説(WSL2)](https://qiita.com/takegongon/items/969f12b80b9a957b8468)

ターミナルは、[Windows Terminal](https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701?hl=ja-jp&gl=jp&icid=en_US_Store_UH_apps_Win) を使用しています。

また、以下の操作はWSL2上の Ubuntu と VScode を使用しています。

## 作業用ディレクトリの作成
任意の階層に作業用ディレクトリを作成します。 

```bash
mkdir mysql-practice
```


## 必要なファイルの準備
`docker-compose.yml`ファイルと`.env`ファイルを作成します。

```bash
touch Dockerfile docker-compose.yml .env
```

## .envの作成

```
MYSQL_ROOT_PASSWORD=mysql_password
MYSQL_USER=mysql_user
MYSQL_PASSWORD=mysql_user_password
```
:::note warn
.envファイルにはパスワードなどの機密情報を記述しているため取り扱いに注意します。
特に、このファイルを公開リポジトリにコミットしないよう注意が必要です。そのためには、 .gitignore ファイルに .env を含めて、Gitの追跡対象から外すことが推奨されます。
:::

## docker-compose.ymlの作成

```
services:
  db:
    container_name: db
    image: mysql:8.0.33-debian
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    ports:
      - 3306:3306
    volumes:
      - mysql-store:/var/lib/mysql
      - ./mysql:/data
    working_dir: /data
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

volumes:
  mysql-store:
```

- services:
この配下にある各サービスは、コンテナとして立ち上がります。
ここには複数のサービス（コンテナ）が記述できます。今回の例では、dbという名前のサービスが定義されています。
- db:
サービスの名前を設定。
- image: mysql:8.0.33-debian
使用するDockerイメージを指定します。DockerHubのMySQLのページからTagsへアクセスし、イメージ名を確認できます。
尚、別途Dockerfileファイルを用意している場合は異なる記述となります。 
- command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
コンテナ起動時に実行するコマンドを指定します。上記コマンドは、MySQLサーバーのデフォルトの文字セットと照合順序を設定するために実行されています。
- ports:
    - 3306:3306
ホストマシンのポート3306をコンテナのポート3306に接続するための記述
- volumes:
    - mysql-store:/var/lib/mysql
    - ./mysql:/data
ホストとコンテナ間でのボリューム（ディスクの一部）の共有を指定します。(データの永続化)
`./mysql:/data`は、カレントディレクトリのmysqlフォルダをdocker環境上の/dataフォルダにマウント(同期)することにより、任意のファイル(SQLスクリプト等 )をdocker環境で使用するためにマウントしている例です。いずれも任意のフォルダを指定可能です。

:::note info
/var/lib/mysql ディレクトリはMySQLのデータベースファイルが格納されるデフォルトのディレクトリです。そのため、通常はこのディレクトリを直接操作することは避けるべきです。
データベースの持続性を保つため、またはデータベースのバックアップやリストアを行うために、このディレクトリをホストマシンのディレクトリとマウントすることは一般的な手法です。その際、MySQLサーバーが動作していない状態でのみ、このディレクトリ内のファイルを操作します。
:::

- working_dir: /data
コンテナ内でコマンドが実行されるデフォルトのディレクトリを指定しています。
必須の設定ではなく、設定しない場合は`/`ルートディレクトリがデフォルトです。  

- environment:
`.env`で定義したrootパスワード、user名・パスワードを参照して定義

- volumes:
  - mysql-store:
ここでは、mysql-storeという名前のDockerボリュームが定義されています。このボリュームは、Dockerが管理している特定のディレクトリ内に存在します。
このボリュームは上記のservices -> db -> volumesで使用されています。

## コンテナの構築・起動

```
docker compose up -d
```

## コンテナに入る

```
docker compose exec db bash
```
## 構築した環境を確認
MySQLにログインします。

```
mysql -u <rootあるいはユーザ名> -p
```

## さいごに

ここまでご覧いただきまして、ありがとうございました。

## 参考

[Docker超入門講座](https://youtu.be/lZD1MIHwMBY)

[マンガでわかるDocker](https://booth.pm/ja/items/825879)

[Docker-docs](https://docs.docker.jp/)

[DockerDesktopをWindowsへインストールする手順を解説(WSL2)](https://qiita.com/takegongon/items/969f12b80b9a957b8468)

[Dockerを使ってMySQLの環境を構築してみました](https://zenn.dev/bloomer/articles/7c879ab2a67abc)