175
138

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-compose MySQL8.0 のDBコンテナを作成する

Last updated at Posted at 2019-07-05

MySQL8.0のデータベースコンテナを10分でサクッと作りたい人向け。

追記: 2021.07.28

PHPからMySQLへ接続する場合

PHP 7.1.16, 7.2.4 以降のバージョンから caching_sha2_password に対応するようになりましたので、デフォルト認証プラグインの設定は不要になります。

Sequel Proをお使いの場合

Sequel Aceという新しいクライアントツールがリリースされました。
MySQL8系でもSequel Proとほぼ同じUIで操作できます。

ベースイメージ

ファイル・ディレクトリ構成

$ tree -a .
.
├── .env
├── docker
│   └── mysql
│       └── my.cnf
├── docker-compose.yml
└── logs
    ├── mysql-error.log
    ├── mysql-query.log
    └── mysql-slow.log

3 directories, 6 files

docker-compose.yml

version: "3"
services:
  db:
    image: mysql:8.0
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}
    ports:
      - ${DB_PORT}:3306

  db-testing:
    image: mysql:8.0
    volumes:
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    tmpfs:
      - /var/lib/mysql
      - /var/log/mysql
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:

補足

db コンテナは開発用、 db-testing コンテナはテスト用です。
db は名前付きボリューム(db-store)を定義して永続化しています。
db-testing はtmpfs一時的なファイルシステムをマウントしているので、コンテナを削除するとデータベースの中身も破棄されます。
データベースの接続情報やタイムゾーンは環境変数から設定します。
その他のデータベースの設定は ./docker/mysql/my.cnf に配置したファイルをコンテナの /etc/mysql/conf.d/my.cnf にマウントしてます。
my.cnfの変更は down して up すれば反映されます。
ただ、デフォルト認証プラグインや既に作成したテーブルの文字コード変更などは手動で変更が必要なものもあります。それは名前付きボリュームを削除して作り直した方が早いかもです。

.env

DB_NAME=homestead
DB_USER=homestead
DB_PASS=secret
DB_PORT=13306
TZ=Asia/Tokyo

my.cnf

# MySQLサーバーへの設定
[mysqld]
# 文字コード/照合順序の設定
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# タイムゾーンの設定
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# デフォルト認証プラグインの設定
default-authentication-plugin = mysql_native_password

# エラーログの設定
log-error = /var/log/mysql/mysql-error.log

# スロークエリログの設定
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# 実行ログの設定
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

# mysqlオプションの設定
[mysql]
# 文字コードの設定
default-character-set = utf8mb4

# mysqlクライアントツールの設定
[client]
# 文字コードの設定
default-character-set = utf8mb4

補足

詳しくはリファレンスマニュアル等を参照

デフォルト認証プラグインの設定してるのはこちらの記事で発生した問題の対策です。

build & up

$ docker-compose up -d
$ docker-compose ps
       Name                     Command             State                 Ports               
----------------------------------------------------------------------------------------------
mysql8_db-testing_1   docker-entrypoint.sh mysqld   Up      3306/tcp, 33060/tcp               
mysql8_db_1           docker-entrypoint.sh mysqld   Up      0.0.0.0:13306->3306/tcp, 33060/tcp
$ docker-compose exec db mysql -V
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

dbコンテナのmysqlへログイン

$ docker-compose exec db bash -c 'mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}'

文字コードの設定

mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| 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.01 sec)

ユーザー一覧(rootユーザーで実行してます)

mysql> select Host, User from mysql.user;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| %         | homestead        |
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
6 rows in set (0.00 sec)

MySQLのデータを初期化

$ docker-compose down --volumes
$ docker-compose up -d

down コマンド時に --volumes オプションを付けるとコンテナと名前付きボリュームの削除が行えます。
up コマンドで再びコンテナを作成すれば初期化された綺麗なdbコンテナを使えます。

MySQLクライアントGUIツールで接続

Sequel Pro で接続

2019年7月5日現在の Sequel Pro v1.1.2 は MySQL8.0 非サポートです。
どうしても接続したい場合は、 Test Build版 を利用してください。

スクリーンショット 2019-07-04 23.58.34.png

Test Build版のアイコンはグレーカラーでなんかカッコイイです

スクリーンショット 2019-07-04 23.58.06.png

  • Name: db-mysql8.0 任意
  • Username: homestead DB_USER
  • Password: secret DB_PASS
  • Database: homestead DB_NAME
  • Port: 13306 DB_PORT

Table Plus で接続

MySQL8.0に対応しているMySQLクライアントツールです。

スクリーンショット 2019-07-05 0.02.56.png
  • Name: db-mysql8.0 任意
  • Username: homestead DB_USER
  • Password: secret DB_PASS
  • Database: homestead DB_NAME
  • Port: 13306 DB_PORT
175
138
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
175
138

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?