MySQL 環境で SQL を書く練習をしたい。この環境は使い捨てにしたいので、Docker で環境を作ることにした。
Docker Hub に MySQL の公式イメージがあるので、目標は簡単に達成できると思っていたが、実際には色々と苦労したので、未来のためここに手順をメモしておく。
苦労したのは日本語の入出力まわりである。Docker イメージ側の設定、mysqld
の設定、MySQL クライアントの設定のみっつが必要となる。 具体的には次のようにした。
まずは Dockerfile
を適当なディレクトリに置く。内容は次の通りだ。
FROM mysql:8.0.29
RUN apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
RUN { \
echo '[mysqld]'; \
echo 'character-set-server=utf8mb4'; \
echo 'character_set_filesystem=utf8mb4'; \
echo 'collation-server=utf8mb4_general_ci'; \
echo 'skip-character-set-client-handshake'; \
echo '[client]'; \
echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf
この Dockerfile
でイメージをビルドする。次のコマンドを叩く。
$ docker build . --tag my-mysql:20220509
すると 20220509
でタグ付けされた my-mysql
イメージができあがる。このイメージからコンテナを次のコマンドで起動する。
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw my-mysql:20220509
これで MySQL デーモンがコンテナ内で立ち上がるので、別なウィンドウから次のように MySQL クライアントを起動すればよい。
$ docker exec -ti $(docker ps | grep mysql | awk '{ print $1 }') mysql -uroot -pmy-secret-pw --default-character-set=utf8mb4
問題なく日本語を入力できるし、サーバー側での保存も問題なく動作する。