DockerでMySQLを使ってみる

# はじめに

[Docker + MySQLで開発環境用DBの作成 - もぐもぐプログラミング](https://mmtomitomimm.blogspot.com/2018/04/docker-mysqldb.html)
こちらのブログ筆者に感謝!!!!

Dockerにて、MySQLの公式イメージを使って環境を構築したい。

公式イメージを使うだけであれば、Docker HubからイメージをPull、そして起動したコンテナ使えばOK。

ただ、そんなことをしたってデータは入ってないし、触ってもなんの意味もないので、MySQL公式のダミーデータ入れないと始まんないよなぁ･･･と思いやってみる。

# 使用するもの

- Docker (Docker Compose)

    Docker Composeについては、参考リンクに記載のさくらのナレッジのページ[https://knowledge.sakura.ad.jp/16862/](https://knowledge.sakura.ad.jp/16862/)がわかりやすいと思う。

- MySQLイメージ(ver. 8.0を使用) [https://hub.docker.com/_/mysql](https://hub.docker.com/_/mysql)

    OS : Linux Debian

## 筆者環境

- macOS mojave 10.14.4
- Docker Desktop 2.0.0.3 (31259)

- Docker Compose: 1.23.2

# 構築① ファイルの準備

## Docker Compose 不使用

Docker Composeを使用せずに、構築するには下記のCommandを順に入力していけば可能である。

```Terminal
# Docker-hubからMySQLのイメージをインストールする
$ docker pull mysql

# インストールしたイメージから、コンテナを起動･作成する
# MYSQL_ROOT_PASSWORDにログインする際のパスワードを設定する
$ docker run -it --name test-wolrd-mysql -e MYSQL_ROOT_PASSWORD=mysql -d mysql:latest

$ docker exec -it test-wolrd-mysql bash -p

# MySQLのコンテナにログインする
$ mysql -u root -p -h 127.0.0.1

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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
```

今回やりたいのはこうではない。。。。


## Docker Compose 使用

まず、Docker-Composeを用いてコンテナを起動するのであれば、下記のようなフォルダ/ファイル構成にする。

フォルダの名前は、任意の名称で問題ない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384111/6379bf99-52d4-6778-2abf-8eb7c3184b8f.png)


各ファイルを見ていく。


### Docker-Compose.yml

Docker Composeでコンテナを管理起動する場合に、要となるファイルである。

```yml:Docker-Compose.yml
# versionは3系が最新版で、versionによって書き方が異なる
version: "3"
services:
  mysql:
    build: ./mysql/db    #Dockerfileからビルドすることを示す
    volumes:
      - ./mysql/DB:/docker-entrypoint-initdb.d  #初期データをマウントする場所
    image: original_mysql_world # イメージの名前
    environment:
      - MYSQL_ROOT_PASSWORD=****   #コンテナ内のMySQLを起動する際のパスワードを設定
```

コメントで大まかに把握できるように記載しているつもりだが、詳細はDocker Composeのリファレンスを見たほうが早い。
[Compose ファイル・リファレンス](http://docs.docker.jp/compose/compose-file.html)

#### world.sql

こいつは、MySQLのサンプルデータのworldというSQLデータベースである。これはもう公式から引っ張ってきただけ。

```SQL:world.sql
-- MySQL dump 10.13  Distrib 5.1.51, for pc-linux-gnu (i686)
--
-- Host: 127.0.0.1    Database: world
-- ------------------------------------------------------
-- Server version       5.1.51-debug-log

/*以下Databaseの内容が記載される
```

[MySQL Documentation](https://dev.mysql.com/doc/index-other.html)

### Dockerfile
MySQLのイメージを引っ張ってくるとともに、ポートの指定や設定ファイルの読み込みを行う。

```Dockerfile:Dockerfile
#使うDockerイメージ
FROM mysql

#ポートを開ける
EXPOSE 3306

#MySQL設定ファイルをイメージ内にコピー
ADD ./my.cnf /etc/mysql/conf.d/my.cnf

#docker runに実行される
CMD ["mysqld"]
```

#### my.cnf

MySQLの文字コードを下記のように設定しておく。

```:my.cnf
[mysqld]
character-set-server=utf8
    
[mysql]
default-character-set=utf8
    
[client]
default-character-set=utf8
```

# 構築② 起動

ターミナルからは、"docker-mysql"フォルダに移動した後、下記のCommandを実行する。

```docker
# イメージのビルド
$ Docker-Compose build

# コンテナの作成
$ Docker-Compose up -d

# 起動したコンテナにログイン
$ docker exec -it Docker-mysql_mysql_1 bash -p

# MySQLを起動
$ mysql -u root -p -h 127.0.0.1

# この後パスワードを入力して完了
```

# 参考

[Compose ファイル･リファレンス - Docker-docs-ja](http://docs.docker.jp/compose/compose-file.html)

[Docker入門（第六回）〜Docker Compose〜 - さくらのナレッジ](https://knowledge.sakura.ad.jp/16862/)

[](https://mmtomitomimm.blogspot.com/2018/04/docker-mysqldb.html)

[docker-compose.ymlの書き方について解説してみた](https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04)

[DockerのMySQLに初期データを投入する
](https://noumenon-th.net/programming/2019/04/01/docker-entrypoint-initdb01/)

[docker-compose でMySQL環境簡単構築](https://qiita.com/A-Kira/items/f401aea261693c395966)

[Docker + MySQLで開発環境用DBの作成 - もぐもぐプログラミング](https://mmtomitomimm.blogspot.com/2018/04/docker-mysqldb.html)

[docker-composeを使うと複数コンテナの管理が便利に - Qiita](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)

[Docker MySQLコンテナ起動時に初期データを投入する - Qiita](https://qiita.com/NagaokaKenichi/items/ae037963b33a85df33f5)

[Docker Compose で複数コンテナ構築＆管理 - Qiita]
(https://qiita.com/prgseek/items/e557a371d7bd1f57b9b1)

# Docker-Composeに関してメモ

Docker-Composeで起動する場合は、複数のコンテナもまとめて起動することができる。

1つのアプリケーションで複数のコンテナを使用したり、各コンテナにオプションを設定する場合には有効である。

また、Docker-Composeはyamlファイルが保存されたディレクトリに移動した上で、Docker-Composeのコマンドをターミナルで実行する。
各アプリケーションでフォルダを分けてymlファイルを管理することで、複数のアプリケーションも実行することが可能となる。