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
/data/dbをmongodb-dataボリュームにリストア
以前、Docker for Macで動かしていた/data/dbディレクトリを、mongodb-dataボリュームにリストアしたいと思います。
- PowerShellのtarコマンドを使用して、dbディレクトリの内容をアーカイブし、mongo.tarファイルを作成しました。
cd db tar cvf ..\mongo.tar *
- 先程のコマンド、ubuntuイメージでコンテナを起動し、/backupにボリュームをマウント、bashを起動します。
docker run -v mongo_mongodb-data:/backup -it ubuntu bash
- 別のPowerSHellで、ubuntuのコンテナIDを確認し、docker cpコマンドでtarファイルをコピーします。
# 別のPowerShellで実行 docker ps docker cp .\mongo.tar <コピー対象のコンテナID>:/tmp
- ボリュームをマウントしたコンテナ内で、/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に由来するようです。
なんとなく、こちらを思い出してしまいます・・・ヒューマンガス様ぁ!(モヒカン