docker-composeでMongoDBとMongo Expressを起動するには

NoSQLの一種、ドキュメント指向データベースのMongoDBと、Webブラウザで利用可能な管理ツールのMongo Expressをdockerで同時に起動したいと思います。

設定手順を記録しておこうと思います。

※19.6.28:Windows版のDockerでうまく動作しなかったため、ボリュームを使った方法を追記致しました。


MongoDB, Mongo Express起動用docker-compose設定手順

Dockerのインストール

下記のバージョンのDockerで、Windows 10とmacOSで動作を確認しました。どちらも問題なく動作しました。


docker-compose.yamlファイル作成

公式のDockerイメージを利用させて頂こうと思います。

ホストOSがLinux, macOSの場合

動作用のフォルダを作成後、docker-compose.yamlファイルを作成します。データが保存されるように、公式のdocker-compose.yamlファイルにvolumesを書き足した形になります。

mkdir mongo
cd mongo
vi docker-compose.yaml

下記の内容になります。

version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    ports:
      - 27017:27017
      - 27018:27018
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: <任意のパスワードを入力>
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: <10行目と同じパスワードを入力>

SELinuxが有効の場合、volumesの各行にラベルを付加する必要があります。

ホストOSがWindowsの場合

Docker for Windows Ver. 18.09.2で試したところ。

mongoコンテナの起動中、次のようなエラーが表示されて再起動してしまいます。

WiredTiger error (1) (中略) handle-open: open: Operation not permitted

どうやらNTFS(ファイルシステム)が原因のようです。こちらの記事の回避方法を取らせて頂きました。

Windows用のdocker-compose.yamlファイルは下記になります。

version: '3.1'

volumes:
  mongodb-data: {}

services:

  mongo:
    image: mongo
    restart: always
    ports:
      - "27017:27017"
      - "28017:28017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: <任意のパスワードを入力>
    volumes:
      - "mongodb-data:/data/db"

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - "8081:8081"
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: <16行目と同じパスワードを入力>

Windowsの場合、ポート番号等をダブルクォーテーションまたはシングルクォーテーションで囲まないとうまく動作しませんでした。

またservicesのvolumesは使用せずに、別途mongodb-dataというボリュームを作成し、そちらにデータを入れます。このためDocker for WindowsのShared Drives設定は、下記のように不要になります。たとえばCドライブについて、こちらの設定を有効にした場合、Windowsファイル共有でCドライブ全体がネットワークに公開されてしまい、セキュリティ上のリスクが発生します。Windowsの場合はdocker volumeを使用したほうが、安全性が高いように思えます。


mongo, mongo-expressコンテナ起動

docker-composeコマンドで起動します。

docker-compose up -d

イメージのダウンロードが始まり、ダウンロード完了後にmongoとmongo-expressが起動します。

mongo-expressはTCPポート番号8081で動作しているようです。


mongo-expressへアクセス

Webブラウザで下記のURLへアクセスすると、mongo-expressを利用できるようです。

http://<DockerホストのIPアドレスまたはホスト名>:8081


mongo等のコマンドを使う場合

mongoコンテナでbashを起動後、mongo等の各種コマンドを利用できました。

docker-compose exec mongo bash
mongo admin -u root -p
<docker-compose.yamlに記載したパスワードを入力>

Mongo Expressでデータベースを作成したところ、mongoコンテナに正常に反映されていました。


データのバックアップ/リストア

ホストOSがLinux, macOSの場合

mongodbのデータは、mongoディレクトリ直下のdbディレクトリに格納されます。バックアップはmongoフォルダごとバックアップを行えば問題ないかと思います。

リストアもmongoフォルダごと取り扱うかたちになります。

ホストOSがWindowsの場合

mongodb-dataボリュームのマウント

Windowsの場合、データはmongo_mongodb-dataボリュームに入るかたちになります。

docker volume ls

docker-compose停止後、下記のコマンドでアクセスが可能のようです。ボリュームを/backupにマウントしてみました。

docker-compose down
docker run -v mongo_mongodb-data:/backup -it ubuntu bash

作成されたボリュームは59GBの容量でした。

/data/dbをmongodb-dataボリュームにリストア

以前、Docker for Macで動かしていた/data/dbディレクトリを、mongodb-dataボリュームにリストアしたいと思います。

  1. PowerShellのtarコマンドを使用して、dbディレクトリの内容をアーカイブし、mongo.tarファイルを作成しました。
    cd db
    tar cvf ..\mongo.tar *

  2. 先程のコマンド、ubuntuイメージでコンテナを起動し、/backupにボリュームをマウント、bashを起動します。
    docker run -v mongo_mongodb-data:/backup -it ubuntu bash
  3. 別のPowerSHellで、ubuntuのコンテナIDを確認し、docker cpコマンドでtarファイルをコピーします。
    # 別のPowerShellで実行
    docker ps
    docker cp .\mongo.tar <コピー対象のコンテナID>:/tmp

  4. ボリュームをマウントしたコンテナ内で、/backupディレクトリの内容を削除後、tarファイルを展開、パーミッションを変更しました。
    rm -fr /backup/*
    cd /backup
    tar xvf /tmp/mongo.tar
    chown -R 999.999 .

以上でDocker for Windowsのmongodb-dataボリュームに、以前使用していたmongodbのデータをリストアすることができました。日常的なバックアップは、dockerのvolumeをバックアップするか、mongodbのダンプ機能を使用する感じでしょうか。

docker run -v mongo_mongodb-data:/data -v ${pwd}:/backup -it ubuntu bash
cd /data
tar cvf /backup/backup.tar *


MongoDBの名前は、humongousに由来するようです。

なんとなく、こちらを思い出してしまいます・・・ヒューマンガス様ぁ!(モヒカン

スポンサーリンク

フォローする

スポンサーリンク