【Docker】Docker DesktopにMySQLのコンテナを作成します。

# はじめに
業務でDockerDesktopにMySQLのコンテナを作成する機会がありましたので、手順を書き起こそうと思います。

:::note warn
今回は検証用でサクッとMySQLのコンテナを作成することが目的になります。
運用するために作るものではないため、そこはご了承下さい。
:::

# 前提
- **MacBook Pro 2020年モデルを使用します。(macOS Monterey バージョン12.3.1)**

![スクリーンショット 2022-04-12 16.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/f6632197-79bd-a797-ddaa-b4f041755ba0.png)

- **Dockerのバージョン(20.10.0)**

```zsh:バージョン
% docker -v
Docker version 20.10.0, build 7287ab3
%
```

:::note info
Docker Desktopに関しては、既に導入済みであることが前提になります。
:::

# 今回の構成
ざっくりになりますが、以下になります。

![MySQL.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/3e65b655-65b2-704f-b334-9da0feb1bac5.png)

# 作業手順(コンテナ作成〜MySQLのログイン迄)
以下の段取りでやっていきたいと思います。

**①ボリューム作成・確認**
**②コンテナ作成・確認**

## ①ボリューム作成・確認

- **ボリューム作成**

コンテナ内で作成したデータを永続化するためのボリュームを作成します。
※コンテナを削除しても、保存したデータは消えないようにするためのものになります。

```zsh:コマンド
docker volume create <ボリューム名>
```

```zsh:実行例
% docker volume create db_storage
db_storage
%
```

- **ボリューム確認**

ボリュームが作成されていることを確認します。

```zsh:コマンド
docker volume list
```

```zsh:実行例
% docker volume list
DRIVER    VOLUME NAME
local     db_storage
%
```

### ②コンテナ作成・確認

- **コンテナ作成**

```zsh:コマンド(テンプレート)
docker run -d --name <コンテナ名> -e MYSQL_DATABASE=<データベース名> -e MYSQL_ROOT_PASSWORD=<rootユーザーのパスワード> -v <作成したボリューム名>:/<ボリュームのパス> -p <外部向けポート番号>:<内部向けポート番号> mysql:<バージョン>
```

今回実行する用でカスタマイズしたものは以下になります。

```zsh:コマンド(今回実行するもの)
docker run -d --name db_container -e MYSQL_DATABASE=db_name -e MYSQL_ROOT_PASSWORD=secret -v db_storage:/var/lib/mysql -p 3305:3306 mysql:5.7

```

```zsh:実行例
% docker run -d --name db_container -e MYSQL_DATABASE=db_name -e MYSQL_ROOT_PASSWORD=secret -v db_storage:/var/lib/mysql -p 3305:3306 mysql:5.7

dc8c5e3eff3e682f48a29cd41c4703386093017bcc3a4a31724d43cb2320a269
%
```

実行例で指定している項目については、以下になります。
※別の機会でオプションについては詳しく解説します。

|  項目  |  設定  |  例  |
| ---- | ---- | ---- |
|  コンテナ名  |  db_container  |  --name db_container |
|  データベース名  | db_name   |  MYSQL_DATABASE=db_name  |
|  管理者パスワード  |  secret  |  MYSQL_ROOT_PASSWORD=secret  |
|  ボリューム  |  ストレージ:db_storage<br>指定パス:/var/lib/mysql  |  -v db_storage:/var/lib/mysql  |
|  外部向けポート番号<br>内部向けポート番号 | 3305<br>3306  |  -p 3305:3306  |
|  MySQLのバージョン  |  5.7  |  mysql:5.7  |

MySQLのコンテナイメージのバージョンについては、以下サイトをご覧下さい。

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

- **コンテナ確認**

```zsh:コマンド
docker ps
```

```zsh:実行例
% docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES
dc8c5e3eff3e   mysql:5.7   "docker-entrypoint.s…"   18 minutes ago   Up 18 minutes   33060/tcp, 0.0.0.0:3305->3306/tcp   db_container
%
```

## ③MySQLログイン確認

```zsh:コマンド
docker exec -it db_container /usr/bin/mysql -u root -p
```

```zsh:実行例
% docker exec -it db_container /usr/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

※MySQLから抜ける場合は、以下コマンドを入力する。

```sql:コマンド
quit
```

```sql:実行例
mysql> quit
Bye
%
```

# 削除(作業完了後)
作業が完了して削除する場合は、以下の段取りで後始末をしていきます。

①コンテナ削除
②ボリューム削除

## ①コンテナ削除
`db_container`を削除します。

- **コンテナ削除**

```zsh:コマンド
docker rm -f db_container
```

```zsh:実行例
% docker rm -f db_container
db_container
%
```

- **コンテナ確認**

```zsh:コマンド
docker ps -a
```

```zsh:実行例
% docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
%
```

## ②ボリューム削除
ボリューム`db_storage`を削除します。

- **ボリューム削除**

```zsh:コマンド
docker volume rm db_storage
```

```zsh:実行例
% docker volume rm db_storage
db_storage
%
```

- **ボリューム確認**

```zsh:コマンド
docker volume list
```

```zsh:実行例
% docker volume list
DRIVER    VOLUME NAME
%
```

# さいごに
業務でDockerやMySQLについて触る機会がありそうなため、今後もいろいろ投稿していこうと思います。
直近まではMicrosoft系の製品ばかり触っていました(調査していました)。(例:AzureADやIntune等)
そのため、全く毛色の違う技術ではありますが、しっかりとやっていきます。

# 参考記事
https://qiita.com/etaroid/items/b1024c7d200a75b992fc

https://qiita.com/ucan-lab/items/5012d25725b86c90992c

https://blackbird-blog.com/docker-mysql01

https://zenn.dev/ajapa/articles/fc1205d4bcbfe7