Docker ComposeでMySQLコンテナを立てる。そもそもDBサーバってなに？

## この記事に書くこと

DockerComposeを使ってローカル環境にMySQLサーバを構築します。
また、図をつかってMySQLサーバーとはなにか？どんな役割かを解説します。

## 前提知識

### Docker Composeって？

> Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。
コマンドを１つ実行するだけで、設定した全てのサービスを作成・起動します。

公式サイトより [Docker Composeをつかう](https://docs.docker.jp/get-started/08_using_compose.html?highlight=mysql)

### MySQLって？

MySQLはオープンソースのリレーショナルデータベース管理システムです。
リレーショナルデータベースとは、データをテーブルという箱に整列して詰めるというデータベースのアプローチ方法の一種です。

### DBサーバって？

DBサーバ　≒　MySQLというデータベース管理システム（DMBS）
DBサーバはデータを管理し、検索、更新、保存を行うサーバのことです。

DBはデータの保管庫で、サーバはデータを提供するコンピュータになります。

![DBサーバー](https://storage.googleapis.com/zenn-user-upload/ddb1c185b50c-20231106.png)


## MySQLコンテナのDBサーバを構築
 
Docker Composeを使って、MySQLのDBサーバを構築します。
データ永続化、初期SQL実行、DBサーバとの接続をゴールとします。

### Step1.必要なファイルの作成

#### 階層

docker-compose.ymlはDocker Composeの設定ファイルです。
script内にデータベースの初期データを配置しています。

```
.
├── docker-compose.yml
└── script
    └── init.sql
```

#### docker-compose

基本的な構成です。
DockerFileを作るほどの内容ではないので、すべてdocker-compose.yml内で設定しています。

```yml:docker-compose.yml
services:
  db:
    image: mysql:8.2.0
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: qiita
      MYSQL_USER: qiita_user
      MYSQL_PASSWORD: password
    volumes:
        -  mysql-data:/var/lib/mysql
        -  ./script:/docker-entrypoint-initdb.d 
volumes:
  mysql-data:
```

**environment**
`MYSQL_USER,MYSQL_PASSWORD`
ルートユーザーと同じスーパー権限が付与されます。

**volumes**
`mysql-data`
mysql-dataという名前のボリュームを、MySQLがデータを保存する/var/lib/mysqlディレクトリにマウントします。
これにより、コンテナを再起動してもデータが保持されます。

`/docker-entrypoint-initdb.d`
初期化時にスクリプトやSQLファイルを自動実行するディレクトリです。
ファイルはアルファベット順に実行されます。

#### 初期データファイル

サンプルデータをinit.sqlに記載しています。
ファイル名は自由に設定可能です。

```sql:init.sql
-- サンプルテーブル
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- サンプルデータ
INSERT INTO users (name, email) VALUES 
('Taro Yamada', 'taro.yamada@example.com'),
('Saki Abe', 'saki.abe@example.com');
```

### Step2.docker composeコマンドでサーバを建てる

docker-compose.ymlが置かれている階層でコンテナ起動コマンドを実行します。
`-d`オプションはバックグラウンドでコンテナを実行します。それにより、ターミナルを複数開く手間が省けます。

```
docker compose up -d
```

### Step3.コマンドでデータベースにアクセス

コンテナ内にターミナルコマンドで入りたい場合は、`docker compose exec コンテナ名　sh`を使用します。

```bash:ターミナル
# shコマンドでコンテナに入る
docker compose exec db sh 

$ mysql -u root -p
Enter password: #rootと入力
mysql> use qiita;
mysql> show tables;
+-----------------+
| Tables_in_qiita |
+-----------------+
| users           |
+-----------------+
1 row in set (0.01 sec)
```

### Step4.クライアントツールをつかってデータベースにアクセス
画像はDBerverですが、他のツールでも以下を設定すれば繋がるはずです。

- host: localhost
- db: qiita
- port: 3307 (ご自身で設定したポートを入力)
- ユーザー名: qiita_user
- パスワード: password

![](https://storage.googleapis.com/zenn-user-upload/4157d1c3ff82-20231106.png)

## まとめ

Docker ComposeでMySQLサーバを構築しました。
基本構成の参考になれば幸いです。

## 参考
DockerHub
https://hub.docker.com/_/mysql

Docker-docs-ja
https://docs.docker.jp/get-started/08_using_compose.html?highlight=mysql

`docker compose up`について
https://docs.docker.jp/v1.12/compose/reference/up.html

初回実行SQL
https://zenn.dev/re24_1986/articles/978801ae092498