Windows を最新にする
バージョンが降るとインストールできない場合があるので、最新かどうか確認します。
Windows キーを押して設定ボタン
を押します。
表示された設定画面の右上の Windows Update 部分をクリックします。
Docker ホームページを開く
下記 URL の Docker 公式ページを開きます。(英語ページです)
https://www.docker.com
インストーラーをダウンロード
Docker Desktop の Download for Windows ボタンを押します。
インストーラーを実行
Docker Desktop Installer.exe がダウンロードされますので、
ダウンロードが完了したら実行します。
終了したら Close and restart ボタンを押して再起動します。
カーネル更新プログラムのインストール
再起動後以下の画面が出たら https://aka.ms/wsl2kernel のリンクを開きます。
※この画面は後で使うので消さないでおいておきます。
x64 マシン用 WSL2 Linux カーネル更新プログラムパッケージ のリンクをクリックします。
保存ボタンを押してダウンロードします。
ダウンロードした wsl_update_x64.msi を実行します。
この画面は今回特に使わないので閉じます。
MySQLで動作確認
まずバージョン情報を見てみます。
cmd と入力して OK ボタンを押します。
Docker バージョン情報表示
docker version
と入力し Enter キーを押して実行します。
つぎに、試しにMySQLを動かしてみます。
以下のコマンドを入力して実行します。
MySQLサーバのDockerコンテナを起動
docker run -e MYSQL_ROOT_PASSWORD=password mysql
ずらずらと表示が出てきて ready for connections. という行が表示されれば起動完了です。
docker run
で docker コンテナという仮想サーバ的なものを起動します。
mysql
というのが立ち上げるコンテナの種類になります。
-e MYSQL_ROOT_PASSWORD=password
は環境変数の設定で MySQL の root ユーザのパスワードを指定しています。
次にサーバに入ってみます。
Windows+R キーでもう一つ別のコマンドプロンプトを起動します。
以下のコマンドで動作中のコンテナ一覧が確認できます。
Dockerコンテナ一覧表示
docker ps
この一覧にある mysql の CONTAINTER ID をコピーしておきます。
※IDは毎回変わります。今回は 11576ddb996a です。
そのID を指定して以下のコマンドを実行します。
Dockerコンテナのシェルに入る
docker exec -it 11576ddb996a bash
そうすると root@11576ddb996a:/#
が表示されます。
これは mysql サーバ内のシェルに入った状態です。
次に以下のコマンドでMySQLクライアントを起動します。
MySQLクライアント起動
mysql -uroot -p
パスワードを聞かれるので環境変数で指定した password を指定します。
以下のように、mysql> が表示されればOKです。
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>
データベース一覧
データベース一覧を表示してみます。
show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
データベース作成
データベースを作成してみます。
create database testdb;
mysql> create database testdb;
Query OK, 1 row affected (0.04 sec)
データベース切り替え
testdbに入ります。
use testdb;
mysql> use testdb;
Database changed
テーブル作成
テーブルを作ってみます。
create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
mysql> create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
Query OK, 0 rows affected (0.04 sec)
レコード挿入
レコードを挿入してみます。
insert into test_users(name,birthday) values('tanaka', '1990-01-02');
mysql> insert into test_users(name,birthday) values('tanaka', '1990-01-02');
Query OK, 1 row affected (0.04 sec)
テーブル内容確認
テーブルの内容を確認します。
select * from test_users;
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 で確認できるものです。
docker stop 11576ddb996a
停止されているか docker ps で確認します。
C:\Users\nakaz>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
一覧が空になっているのでコンテナが停止したことが確認できました。
コンテナの起動
再度起動したいときは以下のコマンドを実行します。
docker start 11576ddb996a
起動したいときにコンテナID がわからなくなった場合は、以下のコマンドで確認できます。
docker ps -a
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
コンテナ削除
もしコンテナが不要になって消したい場合は以下のコマンドを実行します。
docker rm 11576ddb996a
C:\Users\nakaz>docker rm 11576ddb996a
11576ddb996a
コンテナ削除後確認
再度 docker ps -a
を実行すると消えていることが確認できます。
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"
FROM mysql
は先ほど使っていた mysql のイメージを元にするという意味です。
RUN...の行は世界で使われている言語設定をインストールしています。その中に日本語も含まれています。
ENV...の行は言語設定(ロケール)を日本、タイムゾーンを東京に設定しています。
ファイル名は Dockerfile と入力してファイルの種類は「すべてのファイル」としてユーザフォルダに保存します。
Docker ファイルから Docker イメージを作成
コマンドプロンプトを開いて dir コマンドで Dockerfile があることを確認します。
以下のコマンドを実行して、Dockerfile から Docker イメージを作成します。
※もともと用意されているイメージ(mysql)に追加でインストールや設定を行ったもので新しいイメージを作ることができます。
docker build -t mysqlj .
※ -t mysqlj
で作成するイメージに名前を付けることができます。(ここでは mysqlj という名前を付けています。)
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
作成したイメージを使ってコンテナを起動
作成したイメージからコンテナを起動します。
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 で日本語を扱う設定にするためにつけています。
日本語動作確認
日本語が入力できるか確認してみます。
docker exec -it mysqlj1 mysql -uroot -p
※コンテナIDの代わりにコンテナ起動時につけた名前を指定することができます。
※bash の部分を mysql にすることでいきなりクライアントを起動することができます。
日本語が扱える設定かどうか確認します。
文字コード設定確認
show variables like '%chara%';
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 になっていると日本語が文字化けしたりします。
日本語レコード作成
データベース一覧を確認します。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
さっき作った testdb がないことがわかります。
これは、コンテナごとに別々のデータ領域が作られるためです。
コンテナは docker run を実行するごとに作成され、 docker ps -a で一覧を確認できます。
先ほどと同じように、データベースとテーブルを作って日本語のレコードを挿入してみます。
mysql> create database testdb;
Query OK, 1 row affected (0.04 sec)
mysql> use testdb;
Database changed
mysql> create table test_users(id int auto_increment primary key, name varchar(10), birthday date);
Query OK, 0 rows affected (0.04 sec)
日本語でレコードを挿入してみます。
insert into test_users(name,birthday) values('山田太郎', '1990-01-02');
mysql> insert into test_users(name,birthday) values('山田太郎', '1990-01-02');
Query OK, 1 row affected (0.04 sec)
日本語レコード確認
挿入したデータを確認してみます。
select * from test_users;
mysql> select * from test_users;
+----+--------------+------------+
| id | name | birthday |
+----+--------------+------------+
| 1 | 山田太郎 | 1990-01-02 |
+----+--------------+------------+
1 row in set (0.00 sec)
正しく表示されました。