gotohayato.com

月(ダークモード)
太陽(ライトモード)

Docker の MariaDB / MySQL イメージを使うときの tips

Docker

Docker で MariaDB / MySQL イメージを使うときのプチ tips をいくつかまとめました。

対象イメージは mariadb:10.5mysql:5.7 ですが、他のバージョンのものでも使えることが多いと思います。

目次

日本語サポートを改善する

character set はデフォルトでは utf8 になっています。 これを utf8mb4 に変更したい場合は、実行コマンドを上書きして --character-set-server オプションで指定します。 これをやる場合は通常 collation も変更したくなるので、 --collation-server オプションであわせてセットします。

Docker Compose では次のようにします。

docker-compose.yml:

version: "3"
services:
db:
image: mariadb:10.5
command:
- mysqld
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci

ちなみに、 MariaDB / MySQL の character set の utf8utf8mb4 の違いを知りたい方のためにかんたんに説明すると、どちらも UTF8 のための character set である点は共通していますが、次のような違いがあります:

  • utf8utf8mb3 のエイリアスで、 3 バイトまでの文字にのみ対応している
  • utf8mb4utf8mb3 がサポートする文字に加えて 4 バイトの文字にも対応している

utf8 では漢字や絵文字が十分にサポートされていません。 utf8mb4utf8 のスーパーセットになっているので、特殊な事情が無いかぎり通常は utf8mb4 の方を使うべきです。

参考:

データベースをダンプする

volume に保存してあるデータベースをダンプするには次のようにします。

docker exec container_id sh -c 'exec mysqldump --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > /tmp/dumped.sql

container_id にはコンテナの ID を渡します。 出力先の /tmp/dumped.sql にはホスト側のパスを指定します。 初回は末尾のリダイレクト > /tmp/dumped.sql を付けずに標準出力で確認するとよいと思います。

Docker Compose の場合は次のようにします。

docker-compose up -d
docker-compose exec container_name sh -c 'exec mysqldump --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" "$MYSQL_DATABASE"' > /tmp/dumped.sql

docker-compose exec は対象のコンテナが起動した後に実行します。 container_name にはそのサービスの名前を入れます。

公式の説明では環境変数 MYSQL_ROOT_PASSWORD が使える想定で root ユーザーを使用していますが、 root のパスワードを MYSQL_RANDOM_ROOT_PASSWORD でセットした場合には MYSQL_ROOT_PASSWORD は使えないため、このように MYSQL_USERMYSQL_PASSWORD を使う必要があると思います。

ちなみに、ブラウザ UI を使いたい場合は Adminer あたりを使うとよいです。 Adminer は MariaDB / MySQL 以外のデータベースもいくつかサポートしています。

docker-compose.yml:

version: "3"
services:
adminer:
image: adminer
restart: always
ports:
- 8080:8080

参考:

タイムゾーンをセットする

タイムゾーンをセットしたい場合は、環境変数 TZ をセットすれば OK です。

docker-compose.yml:

version: "3"
services:
db:
image: mariadb:10.5
environment:
TZ: "Asia/Tokyo"

タイムゾーンはログ出力の日時等に影響します。 ちなみにログのフォーマットは固定なので変更できません。

起動を待つ

MariaDB / MySQL コンテナを利用する他のコンテナで MariaDB / MySQL の起動を待ちたい場合は、 wait-for-it.sh 等の定番のスクリプトを使用するのがかんたんです。

docker-compose.yml

version: "3"
services:
db:
image: mariadb:10.5
app:
build: .
depends_on:
- "db"
command:
- ./wait-for-it.sh
- db:3306
- --
- python
- app.py

参考:

これは Docker 公式ドキュメントでも紹介されている方法です。

同種のスクリプトやコマンドがたくさん提供されているので、必ずしも wait-for-it.sh を使う必要はありません。 用途と好みにあったものを使うとよいと思います。

もしこのあたりのツールを使いたくなければ、自前のシェルスクリプトで待つ形でも OK です。

以上です。


後藤隼人
ウェブサイト制作・ウェブアプリ開発やマーケティングをしています。
GitHub

お知らせ

大阪大学医学部附属病院さんで現在クラウドファンディングのプロジェクトをされています(後藤も少しだけ寄附させていただきました)。
© 2020 gotohayato.com
サイトについてタグアーカイブメッセージを送る