🙌

余計なことをせずにDockerでMySQLのDBを立ち上げるまで

2022/06/13に公開

DockerでDBを立ち上げるのは良くあるが、最低限必要なものが良く分からなかったので記載する。

プロジェクト構成

sample_database
├── db
│   └── conf.d
│       └── my.cnf
└── docker-compose.yml

用意するのは以下の2ファイル。

  • my.cnf:MySQLの設定ファイル。
  • docker-compose.yml:コンテナ(MySQL)を起動する時の定義を記載。MySQLの公式イメージを参考にして書く。

公式イメージ

MySQLは公式でイメージが用意されているのでそれを使用する。

https://hub.docker.com/_/mysql

docker-compose.yml

Docker周りのことはdocker-compose.ymlに書く。

version: '3.9'
services:
  sample-database:
    image: mysql:5.7
    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/conf.d:/etc/mysql/conf.d
    environment:
      - MYSQL_DATABASE=sample
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=root
    ports:
      - "3306:3306"

起動

docker-compose up

停止

docker-compose down

image

イメージとは

Docker イメージとはコンテナの土台です。
Docker はダウンロードしたイメージを Docker ホスト上に保管しており、それらを見ることができます。もしホスト上にイメージがなければ、Docker はレジストリからイメージをダウンロードします。[1]

今回はmysql:5.7を使用する。

volumes

ボリュームとは

Docker コンテナによって作成され、かつ、使われるデータを保持するために、ボリュームは適した仕組みです。[2]

表記

ホスト上のパスや 名前付きボリュームnamed volumes のマウントを、サービスのサブオプションとして指定します。

短い書式short syntax は、一般的に [ソース:]ターゲット[:モード] の形式を使います。 ソース の場所にはホスト上のパスまたはボリューム名のどちらかを指定できます。[3]

今回はホスト上のパス:ターゲットで表記するので以下のようになる。

    volumes:
      - ./db/data:/var/lib/mysql
      - ./db/conf.d:/etc/mysql/conf.d
      - ./sql:docker-entrypoint-initdb.d

./db/data:/var/lib/mysql

データの保存先をマウントする。

MYSQLのWhere to Store Dataを参考にしてターゲット側には/var/lib/mysqlで設定する。[4]
Docker起動時に./db/data配下に色々できる。

./db/conf.d:/etc/mysql/conf.d

設定ファイルをマウントする。Docker起動時に読み込む。

MYSQLのUsing a custom MySQL configuration fileを参考にしてターゲット側には/etc/mysql/conf.dで設定する。[5]

/etc/mysql/conf.dには以下のようなcnfファイルを用意する。

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

[client]
default-character-set=utf8mb4

environment

    environment:
      - MYSQL_DATABASE=sample
      - MYSQL_USER=user
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=root
  • MYSQL_DATABASE:起動時に作成するDB名
  • MYSQL_USER:任意のユーザー名
  • MYSQL_PASSWORD:MYSQL_USERに紐づくパスワード
  • MYSQL_ROOT_PASSWORD:管理者(root)のパスワード

ports

    ports:
      - "3306:3306"

ポートの設定を行う。ホスト:コンテナの形で書く。ホストで3307でつなぐ場合は3307:3306と書く。

脚注
  1. イメージの構築 ↩︎

  2. ボリュームの使用 ↩︎

  3. Compose ファイル version 3 リファレンス#volumes ↩︎

  4. MySQL#Where to Store Data ↩︎

  5. MySQL#Using a custom MySQL configuration file ↩︎

Discussion