Windows10 Home に Docker Desktop をインストールしてMySQLサーバを起動してSQLで動作確認するまでの手順2021/02

# Windows を最新にする

バージョンが降るとインストールできない場合があるので、最新かどうか確認します。
Windows キーを押して設定ボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/507c28e2-8cb5-9ad9-4679-28e8637098dc.png)
を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/cdfafe07-4553-dd66-5c66-e251b15301ea.png)
表示された設定画面の右上の Windows Update 部分をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/5b9583ec-f405-a2a6-06fd-608032f60fc2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/894bddd6-ec3e-0813-f411-d23d7738ad4c.png)

# Docker ホームページを開く

下記 URL の Docker 公式ページを開きます。（英語ページです）
https://www.docker.com
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/b30ba90b-2672-3e19-4d91-dadef15300bf.png)

# インストーラーをダウンロード

Get Started ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/27a27767-2313-eb47-bb4c-dffd24061523.png)

Docker Desktop の Download for Windows ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/cceb13d2-69eb-2ab0-08b0-8cc60a09fcf9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/b2cd1f5f-b682-d8ed-9b82-80e293368b16.png)

# インストーラーを実行

Docker Desktop Installer.exe がダウンロードされますので、
ダウンロードが完了したら実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f918f9dd-858b-1c7b-afcd-e1b3051697f9.png)

チェックは全てつけた状態で Ok ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/cd4b0946-f748-dc67-085c-6e9c02034673.png)

しばらく待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/dfc18d7e-a01b-64d4-59fc-de6aad606e39.png)

終了したら Close and restart ボタンを押して再起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/503edf64-e349-38d0-cd3c-7fe5f1b09a82.png)

## カーネル更新プログラムのインストール

再起動後以下の画面が出たら https://aka.ms/wsl2kernel のリンクを開きます。
※この画面は後で使うので消さないでおいておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/fcde9a5b-d889-ac68-d283-025c9fe833d4.png)

x64 マシン用 WSL2 Linux カーネル更新プログラムパッケージ のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/05a4e37a-0e8c-1b4d-7d34-91ff1e1c7e88.png)
保存ボタンを押してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f2327ac3-8cc1-d869-2583-01e83a2947ad.png)
ダウンロードした wsl_update_x64.msi を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/c115b294-e646-511b-5b9f-b8c06a3fb5ea.png)

Next ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/5ad00aa3-e881-72bc-7cc3-23b9ec81f607.png)

Finish ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/8bd3195b-7704-182c-1f72-46b88f8b857f.png)

Restart ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/db9f304e-d924-51e3-7de3-ee6eb0dac8aa.png)

しばらく待つとDockerが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3b6b8d10-4377-ab0a-9759-fb8b0bae2502.png)

この画面は今回特に使わないので閉じます。

# MySQLで動作確認

まずバージョン情報を見てみます。

Windows+R キーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/66cd8de3-c42c-f6f4-561c-2a4c61cf012d.png)

cmd と入力して OK ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/49cf7e1e-764b-6244-d54b-1e8745a6a3c6.png)

## Docker バージョン情報表示

```docker version``` と入力し Enter キーを押して実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/c35adec7-81c5-c4d4-daab-77efc4a09632.png)

ずらずらと情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/dd720a7a-4ef8-b8b9-28b7-e43534138be3.png)

つぎに、試しにMySQLを動かしてみます。
以下のコマンドを入力して実行します。

## MySQLサーバのDockerコンテナを起動

```sh:MySQLサーバの起動
docker run -e MYSQL_ROOT_PASSWORD=password mysql
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/9ff36dd6-7edb-461f-90ce-2be0ee41e82e.png)
ずらずらと表示が出てきて ready for connections. という行が表示されれば起動完了です。

```docker run``` で docker コンテナという仮想サーバ的なものを起動します。
```mysql``` というのが立ち上げるコンテナの種類になります。
```-e MYSQL_ROOT_PASSWORD=password``` は環境変数の設定で MySQL の root ユーザのパスワードを指定しています。

次にサーバに入ってみます。
Windows+R キーでもう一つ別のコマンドプロンプトを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/787d2ba6-795c-1d49-0802-002ca0a0b5fb.png)

以下のコマンドで動作中のコンテナ一覧が確認できます。

## Dockerコンテナ一覧表示

```sh:実行中Dockerコンテナ一覧を表示
docker ps
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3da24fa4-e754-195b-ab9c-351b9276e4df.png)

この一覧にある mysql の CONTAINTER ID をコピーしておきます。
※IDは毎回変わります。今回は 11576ddb996a です。

そのID を指定して以下のコマンドを実行します。

## Dockerコンテナのシェルに入る

```sh:Dockerコンテナのシェルに入る
docker exec -it 11576ddb996a bash
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4182df96-6e8c-6779-16eb-2a12287769ac.png)

そうすると ```root@11576ddb996a:/#``` が表示されます。
これは mysql サーバ内のシェルに入った状態です。

次に以下のコマンドでMySQLクライアントを起動します。

## MySQLクライアント起動

```sh:MySQLクライアント起動
mysql -uroot -p
```

パスワードを聞かれるので環境変数で指定した password を指定します。

以下のように、mysql> が表示されればOKです。

```sh:MySQLクライアント起動後
root@11576ddb996a:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.23 MySQL Community Server - GPL

Copyright (c) 2000, 2021, 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>
```

## データベース一覧

データベース一覧を表示してみます。

```sql:データベース一覧表示
show databases;
```

```sql:データベース一覧表示後
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
```

## データベース作成

データベースを作成してみます。

```sql:データベース作成
create database testdb;
```

```sql:データベース作成結果
mysql> create database testdb;
Query OK, 1 row affected (0.04 sec)
```

## データベース切り替え

testdbに入ります。

```sql:データベース切り替え
use testdb;
```

```sql:データベース切り替え結果
mysql> use testdb;
Database changed
```

## テーブル作成

テーブルを作ってみます。

```sql:テーブル作成
create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
```

```sql:テーブル作成結果
mysql> create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
Query OK, 0 rows affected (0.04 sec)
```

## レコード挿入

レコードを挿入してみます。

```sql:レコード挿入
insert into test_users(name,birthday) values('tanaka', '1990-01-02');
```

```sql:レコード挿入結果
mysql> insert into test_users(name,birthday) values('tanaka', '1990-01-02');
Query OK, 1 row affected (0.04 sec)
```

## テーブル内容確認

テーブルの内容を確認します。

```sql:テーブル内容確認
select * from test_users;
```

```sql:テーブル内容確認結果
mysql> select * from test_users;
+----+--------+------------+
| id | name   | birthday   |
+----+--------+------------+
|  1 | tanaka | 1990-01-02 |
+----+--------+------------+
1 row in set (0.00 sec)
```

問題なく使えますね。（日本語を使っていないのは実は現状では扱えないためです。この後日本語も扱う方法を紹介します。）

# 後片付け

```mysql>``` が表示されている状態で exit を実行し、MySQL クライアントを終了します。

```root@11576ddb996a:/#``` が表示されている状態で exit を実行し、シェルを終了します。

## コンテナ停止

次に以下のコマンドでMySQLサーバを停止します。
※ 11576ddb996a は コンテナID です。docker ps で確認できるものです。

```sh:Dokcerコンテナ停止
docker stop 11576ddb996a
```

停止されているか docker ps で確認します。

```text:実行中コンテナ一覧
C:\Users\nakaz>docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

一覧が空になっているのでコンテナが停止したことが確認できました。

## コンテナの起動

再度起動したいときは以下のコマンドを実行します。

```sh:コンテナ起動
docker start 11576ddb996a
```

起動したいときにコンテナID がわからなくなった場合は、以下のコマンドで確認できます。

```sh:停止中も含めたコンテナ一覧
docker ps -a
```

```text:停止中も含めたコンテナ一覧実行結果
C:\Users\nakaz>docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                     PORTS     NAMES
11576ddb996a   mysql     "docker-entrypoint.s…"   41 minutes ago   Exited (0) 4 minutes ago             naughty_curran
```

## コンテナ削除

もしコンテナが不要になって消したい場合は以下のコマンドを実行します。

```sh:コンテナ削除
docker rm 11576ddb996a
```

```sh:コンテナ削除結果
C:\Users\nakaz>docker rm 11576ddb996a
11576ddb996a
```

## コンテナ削除後確認

再度 ```docker ps -a``` を実行すると消えていることが確認できます。

```text:コンテナ削除後確認結果
C:\Users\nakaz>docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

# MySQL で日本語入力に対応する

先ほどのやり方だと MySQL で日本語が正しく扱えない状態ですので、日本語対応の環境を作ってみます。
また、タイムゾーンも世界標準時(UTC)となっているので日本時間にしてみます。

メモ帳を開いて以下の内容を入力します。

## Dockerfile 作成

```
FROM mysql
RUN apt-get update && apt-get install -y locales-all
ENV LC_ALL="ja_JP.UTF-8" TZ="Asia/Tokyo"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/7ba866bd-c4d9-5a8b-69e3-8a50955169ed.png)

```FROM mysql``` は先ほど使っていた mysql のイメージを元にするという意味です。
RUN...の行は世界で使われている言語設定をインストールしています。その中に日本語も含まれています。
ENV...の行は言語設定（ロケール）を日本、タイムゾーンを東京に設定しています。

ファイル名は Dockerfile と入力してファイルの種類は「すべてのファイル」としてユーザフォルダに保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/e035cfad-de1f-c06e-2460-1784805d7576.png)

## Docker ファイルから Docker イメージを作成

コマンドプロンプトを開いて dir コマンドで Dockerfile があることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/58c7a34a-9831-d0bb-35a6-80331152c97c.png)

以下のコマンドを実行して、Dockerfile から Docker イメージを作成します。
※もともと用意されているイメージ(mysql)に追加でインストールや設定を行ったもので新しいイメージを作ることができます。

```sh:Dockerイメージ作成
docker build -t mysqlj .
```
※ ```-t mysqlj``` で作成するイメージに名前を付けることができます。（ここでは mysqlj という名前を付けています。）

```sh:Dockerイメージ作成結果
C:\Users\nakaz>docker build -t mysqlj .
[+] Building 0.2s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                               0.1s
 => => transferring dockerfile: 306B                                                                               0.0s
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 2B                                                                                    0.0s
 => [internal] load metadata for docker.io/library/mysql:latest                                                    0.0s
 => [1/2] FROM docker.io/library/mysql                                                                             0.0s
 => CACHED [2/2] RUN apt-get update && apt-get install -y locales-all                                              0.0s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:9708290e1f00c169ec210361aa1dcebe60744b694b8eb3325bf7cf862e8af7b5                       0.0s
 => => naming to docker.io/library/mysqlj                                                                          0.0s
```

## 作成したイメージを使ってコンテナを起動

作成したイメージからコンテナを起動します。

```sh:日本語対応MySQLサーバ起動
docker run --name=mysqlj1 -e=MYSQL_ROOT_PASSWORD="password" mysqlj mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
```
※--name=mysqlj1 でコンテナに名前を付けることができます。ここでは mysqlj1 という名前を付けています。
※mysqld 以降は MySQL で日本語を扱う設定にするためにつけています。

## 日本語動作確認

日本語が入力できるか確認してみます。

```sh:MySQLクライアント起動
docker exec -it mysqlj1 mysql -uroot -p
```

※コンテナIDの代わりにコンテナ起動時につけた名前を指定することができます。
※bash の部分を mysql にすることでいきなりクライアントを起動することができます。

日本語が扱える設定かどうか確認します。

## 文字コード設定確認

```sh:文字コード設定確認
show variables like '%chara%';
```

```sh:文字コード設定確認結果
mysql> show variables like '%chara%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.02 sec)
```

ちなみに、最初の日本語が扱えない時の設定は以下のようになっていました。

```
mysql> show variables like '%chara%';
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | latin1                         |
| character_set_connection | latin1                         |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | latin1                         |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8                           |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.03 sec)
```

※latin1 になっていると日本語が文字化けしたりします。

## 日本語レコード作成

データベース一覧を確認します。

```sh:データベース一覧確認結果
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```

さっき作った testdb がないことがわかります。
これは、コンテナごとに別々のデータ領域が作られるためです。
コンテナは docker run を実行するごとに作成され、 docker ps -a で一覧を確認できます。

先ほどと同じように、データベースとテーブルを作って日本語のレコードを挿入してみます。

```sql:データベース作成結果
mysql> create database testdb;
Query OK, 1 row affected (0.04 sec)
```

```sql:データベース切り替え結果
mysql> use testdb;
Database changed
```

```sql:テーブル作成結果
mysql> create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
Query OK, 0 rows affected (0.04 sec)
```

日本語でレコードを挿入してみます。

```sql:レコード挿入
insert into test_users(name,birthday) values('山田太郎', '1990-01-02');
```

```sql:レコード挿入結果
mysql> insert into test_users(name,birthday) values('山田太郎', '1990-01-02');
Query OK, 1 row affected (0.04 sec)
```

## 日本語レコード確認

挿入したデータを確認してみます。

```sql:テーブル内容確認
select * from test_users;
```

```sql:テーブル内容確認結果
mysql> select * from test_users;
+----+--------------+------------+
| id | name         | birthday   |
+----+--------------+------------+
|  1 | 山田太郎     | 1990-01-02 |
+----+--------------+------------+
1 row in set (0.00 sec)
```

正しく表示されました。