【docker container】MySQL サーバーを起動し、ユーザーとデータベースを作成する

# はじめに
この記事では、Docker の `docker container run` コマンドを使って MySQL サーバを起動し、ユーザーとデータベースを作成する手順について記載します。

https://docs.docker.com/reference/cli/docker/container/run/

# 開発環境
開発環境は以下の通りです。

- Windows 11
- Docker Engine 26.1.1
- MySQL 8.0.33 for Win64 on x86_64

# MySQL サーバーを起動する
まずは以下のコマンドで MySQL サーバーをコンテナで起動します。

```powershell
docker container run               `
--name db                          `
--rm                               `
--env MYSQL_ROOT_PASSWORD=password `
--publish 3306:3306                `
mysql
```

- `--name` : コンテナ名を `db` に指定
- `--rm` : コンテナ停止時にコンテナを自動削除
- `--env` : 環境変数 `MYSQL_ROOT_PASSWORD` の値を `password` に指定
- `--publish` : コンテナの3306番ポートをホストマシンの3306番ポートにマッピング

`MySQL Server - start.` と表示され、起動したことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/ddc7219c-c6be-b08b-9e5f-5dc919d3f7d0.png)

また、`docker container ls` で `db` という名前のコンテナが3306番ポートで起動していることも確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/e971bc84-5bd8-3f78-3d24-a2125901748f.png)


:::note warn
オプションで環境変数を指定しないと、以下のエラーメッセージが表示され、コンテナの起動に失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/b6f60066-2bef-64c4-b7b8-f6509695973f.png)

:::

:::note
オプションに `--detach` を追加すると、コンテナをバックグラウンドで実行することができます。
以下のようにコマンド実行後、コンテナIDが表示されます。その後、プロンプトが切り替わり、操作待ちになります。

```powershell
docker container run               `
--name db                          `
--rm                               `
--detach                           `
--env MYSQL_ROOT_PASSWORD=password `
--publish 3306:3306                `
mysql
f159f7efd7a93f5a44f4ebe2d0791c87efef2bda139ce9b3642bd567c672d885
```

:::

# MySQL サーバーに接続する
次に以下のコマンドで、ホストマシンからコンテナの MySQL サーバーに接続します。

```powershell
mysql --host=127.0.0.1 --port=3306 --user=root --password=password
```

- `--host` : ローカルサーバー
- `--port` : サーバー起動時に指定したホストマシンのポート番号（3306番は MySQL サーバーのデフォルト値のため省略可能）
- `--user` : ルートユーザー
- `--password` : サーバー起動時に指定したパスワード

プロンプトが `mysql` に切り替わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/53204ee4-2dd7-82c3-c623-eace6f579b21.png)

以下のコマンドで、MySQL のバージョンを確認できます。

```mysql
select version();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/d9dd123d-2998-53cf-bcd1-007d6234b741.png)

次の操作に向け、一度コンテナを停止（削除）します。

```
docker container stop db
```

# MySQL サーバーを起動し、ユーザーとデータベースを作成する
今度はコンテナで MySQL サーバーを起動した際、ユーザーとデータベースが作成されるようにします。

```powershell
docker container run                    `
--name db                               `
--rm                                    `
--env MYSQL_ROOT_PASSWORD=root_password `
--env MYSQL_USER=app                    `
--env MYSQL_PASSWORD=app_password       `
--env MYSQL_DATABASE=test               `
--publish 3306:3306                     `
mysql
```

- `MYSQL_ROOT_PASSWORD` : ルートユーザーのパスワード
- `MYSQL_USER` :  起動時に作成するユーザー
- `MYSQL_PASSWOR` :  作成するユーザーのパスワード
- `MYSQL_DATABAS` :  起動時に作成するデータベース

今回も `MySQL Server - start.` と表示され、起動したことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/fca72e82-3ae1-bbfa-8122-465ed31d2fb9.png)

# MySQL サーバーに接続する
今回は起動時に指定したユーザーやデータベースを指定して、MySQL サーバーに接続します。

```powershell
mysql --host=127.0.0.1 --port=3306 --user=app --password=app_password test
```

プロンプトが `mysql` に切り替わった後、以下のコマンドで、MySQL 接続時に認証が行われたユーザー名とホスト名が取得できます。

```mysql
select current_user();
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/efb7777f-8448-123a-e69a-e99591b45262.png)

また、起動時に指定したデータベースが作成されていることも確認できます。

```mysql
show databases;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318188/cddd3fb5-eadf-8e7a-07bf-a488f7e46af8.png)


# 参考
- [docker run](https://docs.docker.com/reference/cli/docker/container/run/)
- [	鈴木亮「開発系エンジニアのためのDocker絵とき入門」秀和システム、2024](https://www.shuwasystem.co.jp/book/9784798071503.html)

# 関連記事

https://qiita.com/Yasushi-Mo/items/96b781581b40ee943bec