とりあえず起動
Dockerを使えば、すぐにMySQLサーバを立ち上げることができます。さっそくやってみましょう。
MySQLコンテナ起動
まずは、必要最低限の設定でMySQLを起動してみます。
docker run でコンテナを起動できます。
必要なのは、MySQLルートユーザのパスワードと使うポート番号です。これだけ指定して、MySQLの最新版でコンテナを起動します。
$ docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest
成功すると次のように表示されます。
$ docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
68ced04f60ab: Pull complete
f9748e016a5c: Pull complete
da54b038fed1: Pull complete
6895ec5eb2c0: Pull complete
111ba0647b87: Pull complete
c1dce60f2f1a: Pull complete
702ec598d0af: Pull complete
4aba2fcbe869: Pull complete
b26bbbd533e6: Pull complete
7bd100a66c55: Pull complete
74149336419a: Pull complete
145ea1f01648: Pull complete
Digest: sha256:4a30434ce03d2fa396d0414f075ad9ca9b0b578f14ea5685e24dcbf789450a2c
Status: Downloaded newer image for mysql:latest
464b81c6ee981d419fc1cc34a466f66122b052ad52077a0d546afd46a9673ec0
$
念の為、docker ps で起動したか確認します。コマンド一発実行するだけでMySQLサーバが起動します。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
464b81c6ee98 mysql:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql01
MySQLコンテナ内のMySQLサーバへ接続
docker exec でコンテナ内のコマンドを実行できます。コンテナに接続してmysqlコマンドを実行します。
$ docker exec -it mysql01 /usr/bin/mysql -u root -p
おお、接続できました! show databases でデータベースの一覧表示もしてみましたがちゃんと出来ていますね。
$ docker exec -it mysql01 /usr/bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.19 MySQL Community Server - GPL
Copyright (c) 2000, 2020, 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> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
通常のMySQLと違って、Dockerコンテナ版です。データベースのデータ本体が格納される部分がコンテナ内にあると、コンテナを破棄した時点で消えてしまいます。
そこで、MySQLの設定やデータ本体ファイルは、Dockerのボリューム機能を使って、コンテナの外へ出します。この辺からはいろいろコンテナ起動時の設定が必要になります。毎回手入力だと面倒なので、ここでdocker-composeの出番となります。
docker-composeを使って起動
docker-compose.yaml の作成
docker-compose.yaml ファイルは、コンテナの動作設定をテキスト形式の構造体で定義したファイルで、docker-comopse はこのファイルを読み込んで、定義内容に基づいてDockerコンテナを操作します。
MySQLをコンテナを起動するdocker-compose.yaml はこんな感じです。
version: '3'
services:
mysql:
image: mysql:latest
container_name: mysql01
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test_database
MYSQL_USER: scott
MYSQL_PASSWORD: tiger
TZ: 'Asia/Tokyo'
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
volumes:
- "/docker/mysql/data:/var/lib/mysql"
- "/docker/mysql/conf:/etc/mysql/conf.d"
- "/docker/mysql/initdb:/docker-entrypoint-initdb.d"
ports:
- 3306:3306
ざっくり翻訳すると、MySQLは最新版、コンテナ名はmysql01、管理者パスワードはroot、SQLServerっぽいユーザを追加してtest_databaseを作る。タイムゾーンは東京、データベースの文字コードはUTF-8、データベース本体は/docker/mysql配下に外出しして永続化する。以上の設定で3306ポートで起動して!という注文内容になっています。
docker-compose.yaml ファイルを作成したら、docker-compose up で起動します。
$ docker-compose up -d
Creating mysql01 ...
Creating mysql01 ... done
MySQLコンテナの起動確認
コンテナが起動したかどうかは、docker-compose ps で確認できます。Stateが Up なら無事起動完了です。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------
mysql01 docker-entrypoint.sh mysql ... Up 0.0.0.0:3306->3306/tcp,
33060/tcp
MySQLのrootユーザで接続
$ docker exec -it mysql01 /usr/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_database |
+--------------------+
5 rows in set (0.00 sec)
docker-compose.yamlで指定した一般ユーザで接続
$ docker exec -it mysql01 /usr/bin/mysql -u scott -ptiger
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test_database |
+--------------------+
2 rows in set (0.00 sec)
MySQLの設定とデータ本体の確認
Dockerボリューム機能を使って、コンテナの外にデータ本体ファイルを外出ししています。念の為、本当にファイルが作成されているか確認してみましょう。docker-compose.yamlのvolumesで指定した通りに作成されていればOKです。
$ ls -l /docker/mysql
合計 12
drwxr-xr-x 2 root root 4096 3月 17 19:27 conf
drwxr-xr-x 6 999 root 4096 3月 17 19:40 data
drwxr-xr-x 2 root root 4096 3月 17 19:27 initdb
$
コンテナ内に作成したファイルはコンテナを破棄した時点で消滅します。よって、コンテナの破棄後も残して置きたいファイルは、ボリュームを使ってコンテナの外に配置することで、永続化することが可能です。永続化したファイルはコンテナを破棄しても残ります。
MySQLコンテナをすべて消す
docker-compose down でMySQLを終了してコンテナを破棄できます。
$ docker-compose down
- docker-compose down –rmi all でイメージファイルも削除します
- docker-compose down -v で永続化ボリュームも削除します
トラブルシューティング
MySQLコンテナが起動しない
docker-compose.yamlファイルに定義ミスがあると、起動に失敗します。docker-composeで起動した場合は、docker-compose ps で状態を確認できます。
Stateが Exit 1 になっていますので、これは異常終了しています。
$ docker-compose ps
Name Command State Ports
---------------------------------------------------------
mysql01 docker-entrypoint.sh mysql ... Exit 1
docker-compose で起動したコンテナのログは、docker-compose logs で確認できます。
Unknown collation と出てますので、コレーションの指定ミスですね。このような感じでコンテナが起動しない場合は、ログを確認して解決してください。
$ docker-compose logs
Attaching to mysql01
mysql01 | 2020-03-17 19:27:55+09:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.19-1debian10 started.
mysql01 | 2020-03-17 19:27:55+09:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
mysql01 | command was: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_generic_ci --verbose --help
mysql01 | 2020-03-17T10:27:55.619497Z 0 [ERROR] [MY-010933] [Server] Unknown collation: 'utf8mb4_generic_ci'.
mysql01 | 2020-03-17T10:27:55.624377Z 0 [ERROR] [MY-010119] [Server] Aborting
コメント