docker-composeでのMySQL環境構築(タイムゾーン、UTF-8対応)
※ この記事は、2021年1月にQiitaに投稿した記事を移植したものです。
2022年4月26日追記
M1 Mac対応版の記事を書きました
はじめに
ローカル開発環境を立てるためにMySQLのコンテナを用意することがよくあるが、(主にタイムゾーンとUTF-8の対応で)毎回同じようなところで詰まって調べていたので、備忘録も兼ねて自分的な「いつものやつ」を残しておく。
結論
ディレクトリ構成
./docker/myqsl/data
をvolumeとすることでDBのデータを永続化する。
なお、初回起動時にこのディレクトリに余計なファイルが入っているとコケることがあるので注意。
.gitkeep
は置いておいて大丈夫だった。
. ├── docker │ └── mysql │ ├── data │ │ └── .gitkeep │ └── Dockerfile ├── .env ├── .gitignore └── docker-compose.yml
各ファイルの内容
Dockerfile
MySQLのバージョンはお好みで。
タイムゾーンを Asia/Tokyo
に、ロケールは en_US.UTF-8
にしている。 日本語にしたければ ja_JP.UTF-8
にする。
FROM mysql:8.0.23 RUN apt-get update && \ apt-get install -y tzdata locales && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && \ locale-gen ENV LANG en_US.UTF-8 CMD ["mysqld", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"]
.env
適宜書き換える。
MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=sample MYSQL_USER=sample_user MYSQL_PASSWORD=sample_password MYSQL_PORT=3306 ADMINER_PORT=8080
docker-compose.yml
version
は特に理由がなければ最新でよさそう。使えるものは公式のドキュメントでわかる。
Adminerはお好みで入れる。個人的にはローカル用なら入れといて損はしないかなと思っている。
version: '3.8' services: db: build: ./docker/mysql env_file: - .env ports: - "${MYSQL_PORT}:3306" volumes: - ./docker/mysql/data:/var/lib/mysql adminer: image: adminer:4.7.8-standalone ports: - "${ADMINER_PORT}:8080"
.gitignore
データ永続化用の docker/mysql/data
と、認証情報が含まれる .env
は必ずignoreする。
.idea
はJetBrainsのIDE用。VSCodeなら .vscode
になる。
docker/mysql/data .env .idea
コマンド
Dockerの基本操作は本稿の趣旨ではないので割愛する。
DBを抹消して作り直すとき
ゴミが残るので、必ず先に down
する。
# コンテナを止めて削除する docker-compose down # volumeでマウントしているデータをディレクトリごと消す rm -rf ./docker/mysql/data # ディレクトリを作り直す mkdir ./docker/mysql/data # gitに.gitkeepをコミットしているなら作り直す。 # ※差分出てるはずなのでgit resetとかで復旧してもよい。 touch ./docker/mysql/data/.gitkeep # 再度立ち上げる。Dockerfileに変更が入っていたら --build も必要 docker-compose up -d
リンク集
- 公式MySQLコンテナ https://hub.docker.com/_/mysql
- 環境変数とかたまに調べる
- 公式Adminerコンテナ https://hub.docker.com/_/adminer