m's blog

備忘録とかメモとか

【MongoDB】Dockerを使ったMongoDBテンプレートを作ってみました【定期バックアップ付き】

【MongoDB】Dockerを使ったMongoDBテンプレートを作ってみました【定期バックアップ付き】

Docker を使った、ローカル環境用の MongoDB テンプレート を作ってみたので、簡単に紹介したいと思います!

2020/07/16 時点でテンプレートに含まれる内容は以下の通りです。

  • MongoDB
  • Mongo Express
  • 定期バックアップ用コンテナ

MongoDB コンテナの設定にはデータの永続化設定も含んでいます。

目次

はじめに

紹介するテンプレートでは Docker Compose の使用を前提にしています。

Docker Compose がインストールされていない場合は、テンプレートは使用できませんので、予めご了承ください。

ベース

以下の Docker Official Images の MongoDB のページの内容をベースに構成 しています。

mongo - Docker Hub

ファイル構成

テンプレートのファイル構成は以下のような感じ。

【MongoDB】Dockerを使った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_USERNAMEMONGO_INITDB_ROOT_PASSWORD はそれぞれ、mongo コンテナで使用するユーザ名とパスワード用の環境変数です。

ME_CONFIG_MONGODB_ADMINUSERNAMEME_CONFIG_MONGODB_ADMINPASSWORD はMongo Expressから、MONGO_USERNAMEMONGO_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を使ったことがない方やテンプレートに興味が沸いた方は、ぜひ一度、試してみてください!