DockerにMySQLをインストールする方法（docker-compose.ymlの設定）

# この記事を書くきっかけ
Webアプリケーションを開発するにあたり、開発環境を構築しています。そこで、コンテナの中にデータベース（MySQL）をインストールすることにしました。ただ、MySQLを通常の方法でインストールすると、自分のパソコンのホストOSにMySQLがダウンロードされてしまいます。そこで、コンテナの中にMySQLをインストールする方法を勉強することにしました。

コンテナの中にMySQLをインストールするには、「docker-compose.yml」という設定ファイルを使用します。このファイルは、Docker上にMySQLをインストールし、立ち上げるまでの一連の手順を記述した「設定書」です。このファイルを使うことで、公式サイトからのダウンロード、rootユーザーの設定、ポート番号の指定といったセットアップ作業が自動化されます。

**この記事の対象者**
- DockerにMySQLをインストールしたい人
- docker-compose.ymlの設定を知りたい人


# Docker Composeを知ろう　
### Docker Composeとは　【What】
Docker Composeとは、複数のDockerコンテナを定義し、実行するためのツールです。

Docker Composeを使用すると、アプリケーションのサービス、ネットワーク、ボリュームなどを1つのYAMLファイル（通常はdocker-compose.yml）に記述して管理できます。これにより、複雑なマルチコンテナアプリケーションを簡単に構築、デプロイ、およびスケールアウトすることができます。

設定書に一括で記述するだけで、複数のコンテナを管理できるなんて便利ですね。

Docker Desktopをインストールすると、Docker Composeも自動的にインストールされます。すでにDocker Desktopをインストールしていれば、Docker Composeを新しくインストールする必要はありません。


### YAMLとは
YAML（YAML Ain't Markup Language）とは、データの構造をシンプルで読みやすい形式で記述するためのデータシリアライズフォーマットです。
データシリアライズフォーマットとは、プログラム内のデータを保存や送信ができる形式に変換するための規約です。

YAMLは設定ファイルとして多くのアプリケーションやツールで使用されています。例えば、Kubernetesの設定ファイル、Docker Composeの設定ファイル、CI/CDパイプラインの定義ファイルなどがYAML形式で書かれています。人間が読み書きしやすい形式でありながら、データの表現力が高いため、よく使用されています。


### Docker Composeの主な機能
1. サービス定義
docker-compose.ymlファイルにアプリケーションの各サービス（コンテナ）を定義できます。各サービスには使用するイメージ、環境変数、ポート、ボリュームなどの設定を指定します。
1. マルチコンテナ管理
1つのコマンドで複数のコンテナを一斉に管理できます。例えば、docker-compose upコマンドを使用すると、定義されたすべてのサービスが起動します。
1. 環境の一貫性
全ての設定がdocker-compose.ymlファイルに記述されているため、環境の一貫性を保つことができます。開発、テスト、本番環境で同じ設定を使用することが可能です。
1. ネットワーク設定
複数のコンテナ間のネットワーク設定を簡単に構築できます。デフォルトでは、同じComposeファイルで定義されたすべてのサービスは、互いに名前でアクセス可能なカスタムネットワークに配置されます。


### Docker Composeの基本コマンド
`docker-compose up`
`docker-compose up -d`
docker-compose.ymlファイルで定義されたサービスを構築して起動します。-dオプションをつけると、バックグラウンドで実行されます。


`docker-compose down`
起動しているすべてのサービスを停止して、コンテナ、ネットワーク、ボリュームを削除します。

`docker-compose ps`
現在のプロジェクトで実行中のサービスを一覧表示します。

`docker-compose exec`
`docker-compose exec db mysql -u root -p`
実行中のサービス内でコマンドを実行します。例えば、MySQLコンテナ内でMySQLクライアントを起動する場合などに使用します。



### docker-compose.ymlファイルを作成する方法 【How】
プロジェクトディレクトリ内にdocker-compose.ymlファイルを作成するための手順

1. ホームディレクトリに移動
`cd ~`

1. プロジェクトディレクトリを作成
`mkdir mysql-docker`

1. プロジェクトディレクトリに移動
`cd mysql-docker`

1. docker-compose.ymlファイルを作成
`touch docker-compose.yml`

1. docker-compose.ymlファイルに内容を記述

作成したdocker-compose.ymlファイルを編集して、必要な内容を記述します。コマンドを使用してエディタを開き、内容を追加します。

例えば、nanoエディタを使用する場合
`nano docker-compose.yml`
```
services:
  app-db:
    container_name: db #コンテナ名を指定
    image: mysql:8
    command:
      --collation-server=utf8mb4_0900_bin
      --transaction-isolation=READ-COMMITTED
    restart: always #host起動時に自動起動
    environment:
      MYSQL_ROOT_PASSWORD: password #初期パスワード
      TZ: Asia/Tokyo #タイムゾーンを東京に
    ports:
      - 53306:3306

```
内容を追加したら、保存してエディタを閉じます。nanoエディタの場合、Ctrl + Oで保存し、Enterを押し、Ctrl + Xで終了します。

**上記のdocker-compose.ymlファイルの内容**
**services:**
Docker Composeファイルの主要なセクションで、すべてのサービス（コンテナ）を定義します。

**app-db:**
このサービスの名前です。任意の名前をつけることができます。このサービスはMySQLデータベースを実行するコンテナを定義しています。

**container_name: db:**
このフィールドは、コンテナの名前を明示的に指定します。この例では、コンテナの名前がdbになります。これにより、docker psコマンドなどでコンテナを簡単に識別できます。

**image: mysql:8:**
このサービスで使用するDockerイメージを指定します。この場合、MySQLのバージョン8を使用しています。Dockerは、このイメージをDocker Hubから取得して使用します。

**command:**
コンテナが起動する際に実行する追加のコマンドを指定します。
--collation-server=utf8mb4_0900_bin：文字セットの照合順序をutf8mb4_0900_binに設定します。
--transaction-isolation=READ-COMMITTED：トランザクションの分離レベルをREAD-COMMITTEDに設定します。

**restart: always:**
この設定により、コンテナが停止した場合に自動的に再起動します。また、ホストマシンが再起動された場合にもコンテナが自動的に起動します。

**environment:**
コンテナに渡す環境変数を設定します。
MYSQL_ROOT_PASSWORD: password：MySQLのrootユーザーの初期パスワードをpasswordに設定します。
TZ: Asia/Tokyo：コンテナ内のタイムゾーンを東京時間に設定します。

**ports:**
ホストマシンとコンテナのポートをマッピングします。この例では、ホストマシンのポート53306をコンテナのポート3306にマッピングします。
53306:3306：ホストのポート53306にアクセスすると、コンテナ内のポート3306（MySQLのデフォルトポート）に接続されます。

***


プロジェクトディレクトリ内にdocker-compose.ymlファイルが作成され、必要な設定が記述されました。次に、Docker Composeを使用してコンテナを起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642333/221f6383-12a9-3db9-ff3a-eb69a70e5dd2.png)

***
`docker-compose ps`コマンドでコンテナが起動しているか確認してみます。

```
% docker-compose ps  

NAME      IMAGE     COMMAND                   SERVICE   CREATED         STATUS         PORTS
db        mysql:8   "docker-entrypoint.s…"   app-db    2 minutes ago   Up 2 minutes   33060/tcp, 0.0.0.0:53306->3306/tcp
```
**上記の結果の解説**

**NAME:**
コンテナの名前。この場合、dbという名前のコンテナが存在します。

**IMAGE:**
使用しているDockerイメージ

**COMMAND:** 
コンテナが実行しているコマンド

**SERVICE:** 
このコンテナに対応するサービスの名前。この場合、app-dbというサービス名です。

**CREATED:** 
コンテナが作成された時間

**STATUS:** 
コンテナの現在のステータス

**PORTS:**
ポートマッピング情報

***
実行中のサービス内でコマンドを実行します
 `docker-compose exec db mysql -u root -p`
```
% docker-compose exec app-db mysql -u root -p

Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.4.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, 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> EXIT;
Bye
```
うまくいっているようです。これで、DockerにMySQLをインストールし、コンテナを起動することができるようになりました。

# まとめ
DockerにMySQLを入れるには、YAML形式のdocker-compose.ymlにいろいろ記述して起動させればいいということがわかりました。