【MongoDB】Dockerを使ったMongoDBテンプレートを作ってみました【定期バックアップ付き】
Docker を使った、ローカル環境用の MongoDB テンプレート を作ってみたので、簡単に紹介したいと思います!
2020/07/16 時点でテンプレートに含まれる内容は以下の通りです。
- MongoDB
- Mongo Express
- 定期バックアップ用コンテナ
MongoDB コンテナの設定にはデータの永続化設定も含んでいます。
目次
はじめに
紹介するテンプレートでは Docker Compose の使用を前提にしています。
Docker Compose がインストールされていない場合は、テンプレートは使用できませんので、予めご了承ください。
ベース
以下の Docker Official Images の MongoDB のページの内容をベースに構成 しています。
ファイル構成
テンプレートのファイル構成は以下のような感じ。
主要なファイルは以下の3つです。
docker-compose.yml
.env.template
.docker/dind-cron/Dockerfile
以下、各ファイルの詳細について、簡単に解説していきたいと思います。
docker-compose.yml
起動コンテナの設定ファイル です。
中身は以下のような感じになっています。
version: '3.1' services: mongo: container_name: sample_mongo image: mongo restart: always env_file: .env ports: - 57017:27017 volumes: - mongo_data:/data/db - ./volumes/mongo/backup:/backup mongo-express: image: mongo-express restart: always env_file: .env ports: - 58081:8081 dind-cron: build: .docker/dind-cron restart: always env_file: .env volumes: - "/var/run/docker.sock:/var/run/docker.sock" volumes: mongo_data: driver: 'local'
まずは、mongo
コンテナから見ていきます。
mongo: container_name: sample_mongo image: mongo restart: always env_file: .env ports: - 57017:27017 volumes: - /mongo_data:/data/db - ./volumes/mongo/backup:/backup
.env
については後述の .env.template
の項目で解説します。(他のコンテナについても同様です)
後述の バックアップコンテナ用に、mongo
コンテナにはコンテナ名を指定 しています。
ホスト側のポートには 57017
を指定しています。
ホストから MongoDB にアクセスする場合は localhost:57017
でアクセス してください。
volumes
フィールドの mongo_data:/data/db
の部分でデータの永続化 を行っています。
また、./volumes/mongo/backup:/backup
の部分は後述の定期バックアップ用のマウント設定 になります。
次に、mongo-express
コンテナを見ていきます。
mongo-express: image: mongo-express restart: always env_file: .env ports: - 58081:8081
Mongo Express はブラウザから MongoDB を操作できる管理用ツール です。
ホスト側のポートは 58081
を指定しています。
ブラウザなどで http://locahost:58081 にアクセスすると Mongo Express のページが表示されます。
続いて、定期バックアップ用コンテナを見ていきます。
dind-cron: build: .docker/dind-cron restart: always env_file: .env volumes: - "/var/run/docker.sock:/var/run/docker.sock"
後述の .docker/dind-cron/Dockerfile
によりビルドされるイメージを使用 します。
/var/run/docker.sock
をマウントしたくない場合は、dind-cron
コンテナはコメントアウトしてください。
(dind-cron
コンテナをコメントアウトした場合は定期バックアップは実行されません。)
.env.template
環境変数設定のテンプレート です。
.env
に名前を変えるか、コピーして使用してください。
.env.template
の中身は以下の通りです。
MONGO_INITDB_ROOT_USERNAME=root MONGO_INITDB_ROOT_PASSWORD=example ME_CONFIG_MONGODB_ADMINUSERNAME=root ME_CONFIG_MONGODB_ADMINPASSWORD=example MONGO_USERNAME=root MONGO_PASSWORD=example
各コンテナで使用する環境変数を定義しています。
MONGO_INITDB_ROOT_USERNAME
と MONGO_INITDB_ROOT_PASSWORD
はそれぞれ、mongo
コンテナで使用するユーザ名とパスワード用の環境変数です。
ME_CONFIG_MONGODB_ADMINUSERNAME
と ME_CONFIG_MONGODB_ADMINPASSWORD
はMongo Expressから、MONGO_USERNAME
と MONGO_PASSWORD
は定期バックアップコンテナから MongoDB にアクセスするためのユーザ名、パスワードになります。
.docker/dind-cron/Dockerfile
定期バックアップ用コンテナのイメージビルドファイル です。
.docker/dind-cron/Dockerfile
の中身は以下の通り。
FROM docker:dind RUN echo '0 3 * * * docker exec -t sample_mongo mongodump --host="localhost:27017" -o /backup/`date "+%Y%m%d_%H%M%S"` -u=$MONGO_USERNAME -p=$MONGO_PASSWORD' >> /etc/crontab RUN crontab /etc/crontab CMD ["sh", "-c", "crond -f"]
ベースとなるイメージは docker:dind
イメージです。
cron を使って、定期的に MongoDB のデータをバックアップする設定をしています。
cron の設定では、docker exec
コマンドを使って mongo
コンテナにアクセスして、mongodumb
を実行しています。
ここで、mongo
コンテナにアクセスするために mongo
コンテナに設定したコンテナ名 sample_mongo
を使用しています。
デフォルトでは毎日3時起動する設定になっていますが、適当に調整してください。
MongoDB 以外のコンテナ、例えば node イメージや python イメージを使ったプログラム用コンテナを追加する場合にも、dind-cron
コンテナを使用でき、cron 設定を1カ所にまとめておくことができます。
またプログラムコンテナ用の Dockerfile
をプロジェクトルートの置く場合は考慮して、dind-cron
コンテナ用の Dockerfile
ファイルは .docker/dind-cron
に設定しています。
まとめ
以上、Docker を使ったローカル環境用の MongoDB テンプレートを簡単に紹介してみました。
MongoDBを使ったことがない方やテンプレートに興味が沸いた方は、ぜひ一度、試してみてください!