Docker DesktopでMySQL環境を構築する

# はじめに
Dockerを使ってMySQLの環境を構築しました。

# 実行環境
OS：MacOS Monterey 12.3.1
Docker：Docker Desktop for Mac 4.7.1
DB：MySQL8.0
DBツール：MySQL Workbench8.0.29 Community

# Docker Desktop for Macをインストール
## インストーラーをダウンロード
[こちらのページ](https://docs.docker.com/desktop/mac/install/)からインストーラーをダウンロードします。

## インストーラーを実行
ダウンロードされたDocker.dmgをダブルクリックし、アプリを「Applications」フォルダに追加します。

```
「"Docker"はインターネットからダウンロードされたアプリケーションです。
　開いてもよろしいですか？」
と表示されるので「開く」を選択します。
```

## Macのパスワード認証
次に以下のメッセージが表示されます。

```
Docker Desktop needs privileged access.
Docker Desktop needs privileged access to install its networking components and links to the Docker apps.
You will be asked for your password.
```

DockerDesktopには特権アクセスが必要なのでMacのパスワードを入力します。
入力するとインストールが始まります。

インストールが完了するとDocker Desktopが起動出来きます。

ちなみにDockerのバージョンを確認する際は以下の通り

```shell
% docker version
Client:
 Cloud integration: v1.0.23
 Version:           20.10.14
 # ・・・
```

## リソース設定を確認しておく
Docker Desktopの画面上部に設定ボタン（歯車マーク）があるので選択し、
「Resources」カテゴリを選択します。

CPUやメモリの使用量などの項目があり、必要に応じて設定します。

# コンテナイメージを取得する
利用したいコンテナイメージを[Docker Hubのページ](https://hub.docker.com/)から探します。

注意として、コンテナイメージは誰でも公開出来るため、
特に理由が無ければ公式が出してるようなイメージを使用することが良いです。

## コンテナイメージを探す
Docker HubのWebページから「MySQL」で検索します。
「Official Image」と記載されているイメージがあるのでこちらを使用してみます。

コンテナイメージを取得するためのコマンドが記載されているので、コピーします。

```shell
docker pull mysql

# ※Dockerコマンドはバージョン1.13から変わっており、
# 　以下の形式が新しいコマンド形式になります。
docker image pull mysql
```


ターミナルでコマンドを実行するとコンテナイメージがダウンロードされます。

```shell
% docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
4be315f6562f: Pull complete 
# ・・・
752752efdaea: Pull complete 
Digest: sha256:2dafe3f044f140ec6c07716d34f0b317b98f8e251435abd347951699f7aa3904
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
```

ダウンロードが完了すると、Docker DesktopのImages画面で「mysql」を確認できます。


# コンテナを作成
## GUIからコンテナを作成する（失敗）
Images画面に追加された「mysql」にフォーカスを当てると「RUN」ボタンが出現します。
押下するとオプション設定を指定出来ます。

今回は以下の内容を設定
**Container Name**
　→mysql-container
**Ports（Local Host）**
　→3306
**Volumes（Host Path）**
　→/Users/xxx/docker/mysql-container/volumes
**Volumes（Container Path）**
　→/var/lib/mysql

コンテナを起動！ と思ったら以上終了。

Containers/Apps画面で作成したコンテナをダブルクリックし、起動ログを見てみます。

```shell
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD
```

引数としてルートパスワードなどが必要だったようです。

見直してみましたが、Docker Desktopの画面上に指定出来そうなところが見当たりませんでした。
なのでコマンドからの起動を試みます。

## CUIからコンテナを作成・起動・接続確認

Docker HubのMySQLのページに起動用のDockerコマンドのサンプルを記載されてありました。
参考にして以下のコマンドを実行します。

```shell
% docker run --name mysql-container -p 3306:3306 -v /Users/xxx/docker/mysql-container/volumes:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0
```

最終的なオプションの設定は以下の通りです。

| オプション | 設定値 | 説明 |
|-------|-------|-------|
| --name　| mysql-container | コンテナ名 |
| -p　| 3306:3306 | 実機とコンテナのポートのバインディング<br/>実機のポート/コンテナのポート |
| -v　| 略）〜/volumes:/var/lib/mysql | ボリュームのバインディング<br/>今回はバインドマウントを使用してます |
| -e　| MYSQL_ROOT_PASSWORD=my-secret-pw | rootユーザーのパスワード |
| -d　| - | コンテナをバックグラウンドで実行 |
| -　| mysql:8.0 | サポートしているバージョンのタグ<br/>他にlatestなどがあります。 |


Containers/Apps画面でmysql-containerが「RUNNING」状態であれば起動しており、
MySQL Workbench等で接続を確認出来れば成功です。

ちなみにMySQL Workbenchで接続後、文字コードを確認してみると以下の通りでした。

```shell
show variables like '%char%';
```

```shell
Variable_name, Value
'character_set_client','utf8mb4'
'character_set_connection','utf8mb4'
'character_set_database','utf8mb4'
'character_set_filesystem','binary'
'character_set_results','utf8mb4'
'character_set_server','utf8mb4'
'character_set_system','utf8mb3'
'character_sets_dir','/usr/share/mysql-8.0/charsets/'
```


# 参考文献

https://docs.docker.com/desktop/mac/install/

https://docs.docker.jp/docker-for-mac/install.html

https://hub.docker.com/

https://hub.docker.com/_/mysql

https://www.mysql.com/jp/products/workbench/