★★★ Twitterやってます。フォローして頂けると嬉しいです(*^^*) ★★★
この記事にはプロモーションが含まれていることがあります

DockerコンテナでMySQLを動かす方法

IT
スポンサーリンク

とりあえず起動

Dockerを使えば、すぐにMySQLサーバを立ち上げることができます。さっそくやってみましょう。

MySQLコンテナ起動

まずは、必要最低限の設定でMySQLを起動してみます。

docker run でコンテナを起動できます。
必要なのは、MySQLルートユーザのパスワードと使うポート番号です。これだけ指定して、MySQLの最新版でコンテナを起動します。

$ docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest
Windows版Dockerの場合

Windowsのフォイアウォールが反応した場合は、アクセスを許可してください。

成功すると次のように表示されます。

$ 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の出番となります。

設定をまとめて実行するという観点では、Dockerfileでも出来ますが、今後、複数のコンテナを一気に操作することになることを考慮すると、個人的には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ポートで起動して!という注文内容になっています。

Windows版Dockerの場合

Windows版Dockerの場合は、ボリュームのマッピング先がWindows側になりますので、ドライブレターからフルパスで指定します。それ以外はLinux版の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:
       - "c:\\work\\docker\\mysql\\data:/var/lib/mysql"
       - "c:\\work\\docker\\mysql\\conf:/etc/mysql/conf.d"
       - "c:\\work\\docker\\mysql\\initdb:/docker-entrypoint-initdb.d"
     ports:
       - 3306:3306

docker-compose.yaml ファイルを作成したら、docker-compose up で起動します。

$ docker-compose up -d
Creating mysql01 ...
Creating mysql01 ... done

MySQLコンテナの起動確認

コンテナが起動したかどうかは、docker-compose ps で確認できます。StateUp なら無事起動完了です。

$ 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
$
Windows版Dockerの場合

Windows版Dockerの場合も、Windows上からファイルが確認できます。

コンテナ内に作成したファイルはコンテナを破棄した時点で消滅します。よって、コンテナの破棄後も残して置きたいファイルは、ボリュームを使ってコンテナの外に配置することで、永続化することが可能です。永続化したファイルはコンテナを破棄しても残ります。

スポンサーリンク

MySQLコンテナをすべて消す

docker-compose down でMySQLを終了してコンテナを破棄できます。

$ docker-compose down
  • docker-compose down –rmi all でイメージファイルも削除します
  • docker-compose down -v で永続化ボリュームも削除します

-v 指定でボリュームも消えるとリファレンスには記載があるのですが、何故か消えませんでした。コンテナを破棄した後、 volumes で指定したフォルダを削除すれば完全消去完了です。

おすすめ書籍の紹介コーナー

Dockerとはなんぞや? という方にオススメの一冊です。

Webエンジニアだけど自分の作ったアプリを自分の手元のコンテナで動かしてみたい、テスト用のアプリ環境を複数作りたい、などなどDockerを使うとインフラエンジニアにお願いしていたことが自分でもできるようになります。そんなあなたにオススメな一冊がこちらです。

最後にインフラエンジニアやっててDockerを極めたい、という方はオライリー本でとことん深くまで突き進んでください。

スポンサーリンク

トラブルシューティング

MySQLコンテナが起動しない

docker-compose.yamlファイルに定義ミスがあると、起動に失敗します。docker-composeで起動した場合は、docker-compose ps で状態を確認できます。

StateExit 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

コメント

タイトルとURLをコピーしました