はてなブログに移行しました
はじめに
ローカル開発環境を立てるために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 # コンテナを止めて削除する
rm -rf ./docker/mysql/data # volumeでマウントしているデータをディレクトリごと消す
mkdir ./docker/mysql/data # ディレクトリを作り直す
touch ./docker/mysql/data/.gitkeep # gitに.gitkeepをコミットしているなら作り直す。
# ※差分出てるはずなのでgit resetとかで復旧してもよい。
docker-compose up -d # 再度立ち上げる。Dockerfileに変更が入っていたら --build も必要
リンク集
- 公式MySQLコンテナ https://hub.docker.com/_/mysql
- 環境変数とかたまに調べる
- 公式Adminerコンテナ https://hub.docker.com/_/adminer