docker-compose でとりあえずのローカル環境用 MySQL サーバを立ち上げる

Jul 29, 2018 ( Feb 11, 2022 更新 )

ローカルホストの開発環境でとりあえず MySQL を立ち上げたいとき用。

しばらく見ないうちに docker-compose の設定ファイルのバージョンが3.2まで上がっていた…。 volumes の書き方がちょっと変わっていた。

docker-compose.yml

yml ファイル全体は以下です。

version: '3.2'
services:
  db:
    image: "mysql:5.7.22"
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - 3306:3306
    volumes:
      # For setting up the schema
      # https://hub.docker.com/_/mysql/
      - type: bind
        source: ./docker/db/init.sql
        target: /docker-entrypoint-initdb.d/init.sql
      # Working dir
      - type: bind
        source: /tmp/docker/tmpdata
        target: /tmp/tmpdata

パスワードの設定

library/mysql - Docker Hub

MYSQL_ROOT_PASSWORD 環境変数で root ユーザのパスワードを設定することができます。 MYSQL_USER, MYSQL_PASSWORD で任意のユーザ作成とパスワード設定もできます。

初期データベースの設定

MYSQL_DATABASE 環境変数でコンテナ作成時に任意のデータベースを作成することもできますが、テーブル設定も一緒につくりたかったので今回は dump から初期設定をすることにしています。

データベースとテーブルを作成する

docker-compose up -d で1度コンテナを起動します。

この時点では、まだ dump ファイルがないので volumes の設定は以下のように作業用ディレクトリの bind だけをするようにしておきます。 この bind したディレクトリ以下に dump ファイルを書き出すようにします。

    volumes:
      - type: bind
        source: /tmp/docker/tmpdata
        target: /tmp/tmpdata

DDL文を流して、必要なデータベースとテーブルを作成します。

dump を取得する

mysqldump で dump をとります。 以下の例では --no-data オプションでデータベースとテーブル定義だけ取るようにしていますが、初期投入データが必要な場合はこのオプションを外せばデータベースに入っている列も dump できます。

MySQL :: MySQL 8.0 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program

root@4f6da29f6e1a:/# mysqldump -p  --databases my-database --no-data > /tmp/tmpdata/init.sql

/docker-entrypoint-initdb.d を利用する

dump を取ったらリポジトリの docker 関連ファイルを配置するディレクトリなどに sql ファイルを配置します。

以下のように、/docker-entrypoint-initdb.d 以下に dump した sql ファイルを bind するようにします。

Compose file version 3 reference | Docker Documentation

    volumes:
      # For setting up the schema
      # https://hub.docker.com/_/mysql/
      - type: bind
        source: ./docker/db/init.sql
        target: /docker-entrypoint-initdb.d/init.sql

/docker-entrypoint-initdb.d 以下に配置した sql ファイルは、 docker コンテナ作成時にアルファベット順に実行されます。 複数の SQL ファイルに初期化 SQL を分けて書いても良さそうです。

コンテナの作成

sql ファイルの準備ができたら、上記の docker-compose.yml を使って

docker-compose up -d

を実行します。

必要なデータベースとテーブル作成が完了した状態で MySQL サーバを起動させることができます。

Return to top