🦔

【Docker】MySQLを簡単に構築

2022/02/06に公開

はじめに

dockerなら結構簡単にローカル環境にMySQLを構築できます。

公式で配布されているimageを利用してできるだけ手間かけずに構築していきます。
細かいところは公式ドキュメント参照

基本的に、ローカルで動かしてみたいとか、勉強用とかでとりあえず作成する用途です。少し時間がたつと、毎回忘れて毎回調べていたので、忘れてもコピペで行けるようにメモとして残しておきます。

目的

  • dockerでMySQLの構築し、コンテナ作成で以下のことまで出来ること
    • MySQLの設定を変更する
    • root 以外のユーザを作成する
  • 任意のDB接続ツールで、作成したユーザでログインできること
    • create table まで実行できて、すぐにDBを使い始められるってことろまで確認

実行環境

環境作成作業

ディレクトリ・ファイル構成

適当なディレクトリ(mysql)を作成して、下記のような感じでディレクトリとファイルを作成します。

ディレクトリ構成
mysql
 ∟ conf
  ∟ my.cnf
 ∟ .env
 ∟ docker-compose.yml

環境変数ファイル作成

.env
ROOT_PASS=root
DB_NAME=hoge-db
DB_USER=user
DB_PASS=p@ssw0rd
DB_PORT=3306
TZ=Asia/Tokyo

DB設定ファイル作成

my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin

[client]
default-character-set=utf8mb4
  • database単位での照合順序を変更したかったので作成
  • すべてデフォルトでよい場合は、作成しなくても動く

docker-composeファイル作成(1)

(1)docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      TZ: ${TZ}
    ports:
        - ${DB_PORT}:3306
    volumes:
        - db-store:/var/lib/mysql
        - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf
volumes:
  db-store:

基本的にコピペでOKです。簡単に説明すると、↓な感じです。

  • db-storeという名前のvolume作成
  • /var/lib/mysql をvolumeへマウントして永続化
  • db設定ファイルの/etc/mysql/conf.d/my.cnf をローカルの./conf/my.cnfへマウント
  • 構築時の変数を.envファイルから読み込む

docker-composeファイル作成(2)※一時DB用

ちょっと変えて、コンテナを停止するたびにDB情報を破棄してくれる一時DBを作成することも可能です。
利用用途としては、unit testを自動で実行させる際のDBなどが考えられます。

(2)docker-compose.yml
version: '3'

services:
  db:
    image: mysql:8
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASS}
      TZ: ${TZ}
    ports:
        - ${DB_PORT}:3306
    tmpfs:
        - /var/lib/mysql
    volumes:
        - ./conf/my.cnf:/etc/mysql/conf.d/my.cnf

(1)のyamlとの違いは、/var/lib/mysqlへのマウント先のみです。
tmpfsは、コンテナが停止するたびに破棄されるため、常にまっさらな状態のDBを利用できます。

# 停止させてから、起動したら初期化されます
docker-compose stop
docker-compose start

# 再起動でも初期化されてます
docker-compose restart

コンテナ作成・起動・確認

コンテナ作成&起動
docker-compose up -d
  • DB接続ツールで接続できるか確認
    • ホスト名   :localhost
    • データベース名:hoge-db
    • ユーザ名   :user
    • パスワード  :p@ssw0rd
    • ポート番号  :3306

関連リンク

【Docker】【MySQL】コンテナ初回起動時にスクリプトを実行させる
【Docker】MySQL環境構築で嵌ったところ

参考にしたサイト

もはや DB は Docker でインストールする時代!初心者のための DB インストール on Docker

docker-compose MySQL8.0 のDBコンテナを作成する

Discussion