MariaDBしたい(mariadb)
services:
db:
image: mariadb:latest
container_name: my-mariadb
environment:
MARIADB_ROOT_PASSWORD: ${MARIADB_ROOT_PASSWORD:-root_password}
MARIADB_DATABASE: ${MARIADB_DATABASE:-app_db}
MARIADB_USER: ${MARIADB_USER:-app_user}
MARIADB_PASSWORD: ${MARIADB_PASSWORD:-app_password}
ports:
- "3306:3306"
volumes:
- db_data:/var/lib/mysql
adminer:
image: adminer:latest
container_name: my-adminer
ports:
- "8080:8080"
environment:
- ADMINER_DEFAULT_SERVER=db
depends_on:
- db
volumes:
db_data:
MariaDBをDockerで起動します。
認証情報は環境変数で設定し、データはnamed volumeで永続化しています。
環境変数は.envで変更します。
上記サンプルでは、デフォルト値を指定しているため、.envファイルがなくても動作します。
Adminerはマルチプラットフォーム対応のデータベース管理ツールで、ブラウザから簡単にMariaDBを管理できます。
起動・停止コマンドは以下の通りです。
$ docker compose up -d
$ docker compose down
動作確認したい
$ docker compose exec db mariadb -u root -p
Enter password: # MARIADB_ROOT_PASSWORD (example) を入力
MariaDB [(none)]>
コンテナー内のMariaDBに接続できます。
動作確認用SQL
SHOW DATABASES;
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE hello (id INT PRIMARY KEY, message TEXT);
INSERT INTO hello VALUES (1, 'Hello MariaDB!');
SELECT * FROM hello;
環境変数したい
MARIADB_ROOT_PASSWORD=your_root_password
MARIADB_DATABASE=your_database_name
MARIADB_USER=your_username
MARIADB_PASSWORD=your_password
認証情報は環境変数で変更できます。
.env ファイルに必要な認証情報を記述し、
ビルドコンテキストのルートに配置してください。
Gitリポジトリで管理している場合は、
.envは.gitignoreに追加して、コミットできないようにしてください。
MariaDBの公式イメージでは、以下の初期設定時の認証情報を設定できます。
環境変数 |
説明 |
必須 |
備考 |
|---|---|---|---|
|
rootユーザーのパスワード |
必須 |
セキュリティ上、必ず設定が必要 |
|
初期作成するデータベース名 |
任意 |
アプリ用DBを自動作成 |
|
初期作成するユーザー名 |
任意 |
アプリ用ユーザーを自動作成 |
|
上記ユーザーのパスワード |
任意 |
|
|
rootパスワードを空にする |
任意 |
セキュリティ上、オススメしない |
|
ランダムなrootパスワードを生成 |
任意 |
ログに出力されるが、使いづらい |
|
自動アップグレードを有効化 |
任意 |
大きなダンプやバージョン移行時に便利 |
いったん初期化したコンテナーでは、これらの環境変数を変更しても反映されません。 変更を反映させたい場合は、ボリュームを削除して再起動してください。
注釈
認証情報はcompose.yamlにベタ書きせず、
.envに保存することが推奨されています。
ヘルスチェックしたい
healthcheck:
test: ["CMD", "mariadb-admin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
mariadb-adminでMariaDBコンテナーが応答可能かを確認しています。
$ docker compose exec db mariadb-admin ping -h localhost -u root -p
Enter password: # example
mysqld is alive
データベースを初期化したい
volumes:
- db_data:/var/lib/mysql
- ./setup:/docker-entrypoint-initdb.d
Dockerのエントリーポイント機能を使ってデータベースを初期化できます。
データベース(/var/lib/mysql)が空の時に/docker-entrypoint-initdb.d/に配置したSQLファイルを使って初期化されます。
初期化用のSQLサンプル
-- データベースの作成
CREATE DATABASE IF NOT EXISTS sample_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ユーザーの作成と権限付与
CREATE USER IF NOT EXISTS 'sample_user'@'%' IDENTIFIED BY 'sample_pass';
GRANT ALL PRIVILEGES ON sample_db.* TO 'sample_user'@'%';
FLUSH PRIVILEGES;
-- テーブル作成
USE sample_db;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 初期データ挿入
INSERT INTO users (name, email) VALUES
('Alice', 'alice@example.com');
init.sqlのようなファイルに保存して、setup/に配置してください。
注釈
再投入したい場合は、docker compose down -vでボリュームを削除して再起動します。
データベースを手動で投入したい(mariadb)
$ docker compose exec -T db \
mariadb \
-uroot -pROOT_PASSWORD \
DATABASE_NAME < dump.sql
$ gunzip -dc dump.sql.gz | docker compose exec -T db \
mariadb \
-uroot -pROOT_PASSWORD \
DATABASE_NAME
既存のデータベースを投入する場合は、
コンテナー内でmariadbコマンドを実行します。
データベースをバックアップしたい(mariadb-dump)
$ docker compose exec -T db \
mariadb-dump \
-uroot -pROOT_PASSWORD \
--databases DATABASE_NAME \
--single-transaction \
--quick \
--routines \
--triggers \
--events \
| gzip > dump.sql.gz
コンテナー側にあるMariaDBデータベース(DATABASE_NAME)を、
ホスト側にダンプするサンプルです。
注釈
このまま実行すると、ホスト側のターミナルの履歴にパスワードなどが残ります。
実際の運用では.envで環境変数を設定し、
sh -lcコマンドで読み込ませるとよいです。
データベースを確認したい
Adminerで確認したい
ブラウザで http://localhost:8080 にアクセスするとAdminerが起動します。
サーバー名に db を入力し、ユーザー名に root、パスワードに example を入力してログインできます。
コマンドラインで確認したい
$ docker compose exec db bash
コンテナー内のbashを起動し、コマンドラインでデータベースを直接操作できます。
$ mariadb -u root -p
Enter password: # rootのパスワードを入力
MariaDB [(none)]> SHOW DATABASES;
MariaDB [(none)]> exit