余計なことをせずにDockerでMySQLのDBを立ち上げるまで
DockerでDBを立ち上げるのは良くあるが、最低限必要なものが良く分からなかったので記載する。
プロジェクト構成
sample_database
├── db
│ └── conf.d
│ └── my.cnf
└── docker-compose.yml
用意するのは以下の2ファイル。
- my.cnf:MySQLの設定ファイル。
- docker-compose.yml:コンテナ(MySQL)を起動する時の定義を記載。MySQLの公式イメージを参考にして書く。
公式イメージ
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ファイルを用意する。
[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と書く。
Discussion