Dockerを使ったMySQL環境の構築

# はじめに
本記事ではDockerを利用したMySQLの環境構築を行います。  
具体的にはMySQLコマンドが実行可能なコンテナを用意する手順をまとめます。
# Dockerイメージをダウンロード
Dockerイメージは、Dockerコンテナの設計図のようなものです。DockerイメージをもとにDockerコンテナを生成します。  
Dockerイメージは自作することもできますが、MySQLのような有名なものについてはDockerHubから取得することが可能です。  
どんなMySQLイメージがダウンロード可能か検索してみます。
```bash
docker search mysql
```
```
NAME                   DESCRIPTION                                      STARS     OFFICIAL
mysql                  MySQL is a widely used, open-source relation…   15470     [OK]
bitnami/mysql          Bitnami container image for MySQL                118       
circleci/mysql         MySQL is a widely used, open-source relation…   30        
cimg/mysql                                                              3         
bitnamicharts/mysql    Bitnami Helm chart for MySQL                     0         
ubuntu/mysql           MySQL open source fast, stable, multi-thread…   65        
rapidfort/mysql        RapidFort optimized, hardened image for MySQL    26        
elestio/mysql          Mysql, verified and packaged by Elestio          1         
google/mysql           MySQL server for Google Compute Engine           25        
docksal/mysql          MySQL service images for Docksal - https://d…   0         
alpine/mysql           mysql client                                     3         
eclipse/mysql          Mysql 5.7, curl, rsync                           2         
mysql/mysql-server     Optimized MySQL Server Docker images. Create…   1023      
jumpserver/mysql                                                        1         
datajoint/mysql        MySQL image pre-configured to work smoothly …   2         
mysql/mysql-router     MySQL Router provides transparent routing be…   28        
ddev/mysql             ARM64 base images for ddev-dbserver-mysql-8.…   1         
mirantis/mysql                                                          0         
ilios/mysql            Mysql configured for running Ilios               1         
corpusops/mysql        https://github.com/corpusops/docker-images/      0         
mysql/mysql-cluster    Experimental MySQL Cluster Docker images. Cr…   100       
vulhub/mysql                                                            0         
javanile/mysql         MySQL for development                            0         
mysql/mysql-operator   MySQL Operator for Kubernetes                    1         
vitess/mysql           Lightweight image to run MySQL with Vitess       1    
```
今回はOracle社が提供してくれているものをダウンロードします。  
**このimageは2年ほど更新されていないため、Docker公式のイメージを使うのが良いかもしれません。詳しくはコメント欄をご確認ください。**
```bash
docker pull mysql/mysql-server
```
ダウンロードしたイメージは以下のコマンドで確認できます。
```bash
docker images
```
```
REPOSITORY           TAG       IMAGE ID       CREATED         SIZE
python               3         230a72fb08c5   3 months ago    1.02GB
...
mysql/mysql-server   latest    1d9c2219ff69   21 months ago   496MB
```
# Dockerコンテナを起動
ここまででコンテナの設計図（Dockerイメージ）の用意が完了しました。次は設計図をもとに仮想の計算機であるDockerコンテナを起動します。  
コンテナの起動には以下のコマンドを使います。
```bash
docker run --name=mysql-server -d mysql/mysql-server
```
` --name=mysql-server `はコンテナに` mysql-server `という名前をつけることを表します。` -d `はバックグラウンドで実行することを表します。  
起動したコンテナを確認するには以下のコマンドを使います。
```bash
docker ps
```
```
CONTAINER ID   IMAGE                COMMAND                   CREATED       STATUS                 PORTS                       NAMES
5fa3ecaf0e04   mysql/mysql-server   "/entrypoint.sh mysq…"   3 hours ago   Up 3 hours (healthy)   3306/tcp, 33060-33061/tcp   mysql-server
```
# コンテナ内でMySQLコマンドを実行
ここまでで仮想の計算機（Dockerコンテナ）の用意が完了しました。最後にコンテナ内でMySQLコマンドを実行します。  
まずコンテナ起動時に自動生成されたMySQLのrootユーザのパスワードを確認します。
```bash
docker logs mysql-server 2>&1 | grep GENERATED
```
```
[Entrypoint] GENERATED ROOT PASSWORD: =2V0@QFU.%l338jo.:7gAnLb9nCJ=0y#
```
` PASSWORD: `以降がパスワードです。**あとでコンテナでMySQLコマンドを実行するのに必要です。**

<details><summary>詳細説明</summary>

linuxにおいて、1は標準出力、2は標準エラー出力、&は両方を意味します。  

` hello, world `とファイルに書き込みます。
```bash
vi sample.txt
```
以下のコマンドは標準出力をsample2.txtに書き込みます。
```bash
cat sample.txt 1>sample2.txt
```
以下のコマンドは標準エラー出力をsample3.txtに書き込みます。
```bash
errorcommand 2>sample3.txt
```
以下のコマンドは標準出力と標準エラー出力をsample4.txtに書き込みます。
```bash
ls . /nonexistent > sample4.txt 2>&1
```
つまり、実行したコマンドはコンテナ中の標準出力と標準エラー出力のうち、` GENERATED `を含むものを出力します。
</details>

---

パスワードを使ってコンテナ上のMySQLサーバーに接続します。
```bash
docker exec -it mysql-server mysql -u root -p
```
` -it `は相互にやり取りすることを表します。  
パスワードが要求されるので先ほど調べたパスワードを入力します。**入力内容は表示されないので注意**

パスワードを変更しないと操作ができないため、パスワードを変更します。
```bash
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword!';
```
新しいパスワードは` YourNewPassword! `です。

これでMySQL環境の構築が完了しました。  
データベースを作成し、userテーブルを作成してみます。
```sql
CREATE DATABASE study_db;
USE study_db;
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    email VARCHAR(100) UNIQUE
);
```

コンテナが不要になったら以下のコマンドで停止、削除します。
```bash
docker stop mysql-server
docker rm mysql-server
```

# 参考文献
[DockerHub mysql/mysql-server](https://hub.docker.com/r/mysql/mysql-server)
[DockerHub mysql](https://hub.docker.com/_/mysql)