docker-composeでのMySQL環境構築(タイムゾーン、UTF-8対応)

※ この記事は、2021年1月にQiitaに投稿した記事を移植したものです。

2022年4月26日追記

M1 Mac対応版の記事を書きました

p5750-tech.hateblo.jp

はじめに

ローカル開発環境を立てるためにMySQLのコンテナを用意することがよくあるが、(主にタイムゾーンUTF-8の対応で)毎回同じようなところで詰まって調べていたので、備忘録も兼ねて自分的な「いつものやつ」を残しておく。

結論

github.com

ディレクトリ構成

./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

リンク集