Dockerを用いたMongoDB Serverの起動方法を説明します。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
動作確認済環境
- Rocky Linux 8.6
- Docker CE 20.10.21
- MongoDB Server 6.0.2
Mongo DB Server
dockerコマンドによる起動
最小設定
以下のようなコマンドでコンテナ版のMongoDBを起動できます。タグの「mongo:latest」の部分はお好みのバージョンに合わせて適宜の変更をお願いします。
docker run -d \ --name mongo01 \ -p 27017:27017 \ mongo:latest
それでは起動したコンテナに接続できるかどうかを試してみましょう。疎通確認用途として、Mongo Shellをインストールします。
cat << 'EOF' > /etc/yum.repos.d/mongodb-org-6.0.repo [mongodb-org-6.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc EOF dnf install -y mongodb-mongosh
mongoshでコンテナへ接続可能な事を確認します。
[root@linux010 ~]# mongosh Current Mongosh Log ID: 63594cd199f6a00c16b59023 Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0 Using MongoDB: 6.0.2 Using Mongosh: 1.6.0 For mongosh info see: https://docs.mongodb.com/mongodb-shell/ ------ The server generated these startup warnings when booting 2022-10-26T15:01:59.463+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted 2022-10-26T15:01:59.464+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never' 2022-10-26T15:01:59.464+00:00: vm.max_map_count is too low ------ ------ Enable MongoDB's free cloud-based monitoring service, which will then receive and display metrics about your deployment (disk utilization, CPU, operation statistics, etc). The monitoring data will be available on a MongoDB website with a unique URL accessible to you and anyone you share the URL with. MongoDB may use this information to make product improvements and to suggest MongoDB products and deployment options to you. To enable free monitoring, run the following command: db.enableFreeMonitoring() To permanently disable this reminder, run the following command: db.disableFreeMonitoring() ------ test>
configファイルの明示指定
それでは次にconfigファイルを明示指定する方法を考えてみましょう。
と言いたいところですが、まずは、configファイルを明示指定する前の挙動を確認します。コンテナの中へ入り、mongodの起動引数を確認します。すると、引数はbing_ip_allのみである事が分かります。これはログがファイルに記録されない最低限の設定である事が分かります。
[root@linux010 ~]# docker exec -it mongo01 /bin/sh # ps aux | grep mongod mongodb 1 1.0 3.5 2607168 141392 ? Ssl 15:01 0:04 mongod --bind_ip_all root 71 0.0 0.0 3312 716 pts/0 S+ 15:09 0:00 grep mongod #
前述の操作で作成したコンテナを一度削除します。
docker container stop mongo01 docker container rm mongo01
それでは、configファイルの明示指定の動作確認をやってみましょう。かなり極端な例ですが、以下は詳細なログを出力するように、systemLog.verbosityを3に変更した設定ファイルです。
mkdir -p /mongodb/etc/ cat << 'EOF' > /mongodb/etc/mongod.conf systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log verbosity: 3 net: port: 27017 bindIp: 0.0.0.0 EOF
また、詳細なログがコンテナではないホストOS側にexportされるよう、exportするディレクトリを作成します。
mkdir -p /mongodb/log/ chmod 777 /mongodb/log
以下はconfigファイルを明示指定してコンテナ版MongoDBを起動する例です。
docker run -d \ --name mongo02 \ -p 27017:27017 \ -v /mongodb/etc:/etc/mongo \ -v /mongodb/log:/var/log/mongodb \ mongo:latest \ --config /etc/mongo/mongod.conf
コンテナの中に入り、想定通りの起動引数が与えられている事を確認します。
[root@linux010 ~]# docker exec -it mongo02 /bin/sh # ps aux | grep mongod mongodb 1 1.5 3.2 2600140 130720 ? Ssl 15:34 0:02 mongod --config /etc/mongo/mongod.conf root 83 0.0 0.0 3312 720 pts/0 S+ 15:37 0:00 grep mongod # cat /etc/mongo/mongod.conf systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log verbosity: 3 net: port: 27017 bindIp: 0.0.0.0 #
mongoshによる接続可能である事を確認します。
[root@linux010 ~]# mongosh --quiet test>
systemLog.verbosityの設定が反映され、大量のログが出力されている事を確認します。
[root@linux010 ~]# tail -f /mongodb/log/mongod.log {"t":{"$date":"2022-10-26T15:38:57.608+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798737,"ts_usec":608201,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:57.708+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798737,"ts_usec":708169,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:57.808+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798737,"ts_usec":808187,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:57.908+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798737,"ts_usec":908207,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.008+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":8154,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.108+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":108173,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.208+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":208162,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.257+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"thread6","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":257032,"thread":"1:0x7fe52cf24700","session_name":"log-server","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_remove: remove to log number 1"}}} {"t":{"$date":"2022-10-26T15:38:58.308+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":308177,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.408+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":408225,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.500+00:00"},"s":"D2", "c":"STORAGE", "id":6321801, "ctx":"TimestampMonitor","msg":"Removing historical entries older than","attr":{"timestamp":{"$timestamp":{"t":0,"i":0}}}} {"t":{"$date":"2022-10-26T15:38:58.508+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":508171,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} {"t":{"$date":"2022-10-26T15:38:58.608+00:00"},"s":"D1", "c":"WTWRTLOG", "id":22430, "ctx":"JournalFlusher","msg":"WiredTiger message","attr":{"message":{"ts_sec":1666798738,"ts_usec":608189,"thread":"1:0x7fe52971d700","session_name":"WT_SESSION.log_flush","category":"WT_VERB_LOG","category_id":20,"verbose_level":"DEBUG","verbose_level_id":1,"msg":"log_flush: flags 0x4 LSN 1/27136"}}} ^C
次の検証シナリオに備え、コンテナを削除します。
docker container stop mongo02 docker container rm mongo02
docker-composeコマンドによる起動
docker-composeを使用した起動例を照会します。以下は「Docker Hub」で照会されたサンプル設定にportsの設定のみを加筆したymlファイルです。
MONGO_INITDB_ROOT_USERNAMEやMONGO_INITDB_ROOT_PASSWORDなどの環境変数を与えると、データベースユーザの定義が可能です。指定可能な環境変数の一覧は「Docker Hub」を参照ください。
cat << 'EOF' > stack.yml version: '3.1' services: mongo: image: mongo restart: always ports: - 27017:27017 environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example EOF
コンテナを起動します。
docker-compose -f stack.yml up -d
まずはユーザ指定なしでMongoDBへの接続を試みます。このymlの設定の場合はユーザが明示的に定義されていますので、認証なしの接続をした場合は操作を拒否されます。
[root@linux010 ~]# mongosh --quiet test> show dbs MongoServerError: command listDatabases requires authentication test>
ユーザ名を明示指定してMongoDBに接続した場合は、操作に成功する事を確認します。
[root@linux010 ~]# mongosh --quiet -u root -p example test> show dbs admin 100.00 KiB config 12.00 KiB local 72.00 KiB test>
次の検証シナリオに備えて、コンテナを削除します。
docker-compose -f stack.yml down
Mongo Express
「Docker Hub」ではMongo Expressと呼ばれるGUIルーツを起動させる操作例が紹介されています。
「MongoDB 公式ドキュメント」では、Mongo ExpressではなくMongoDB Compassを推している事は留意ください。
以下はMongoDB ServerとMongo Expressの2つのコンテナを起動するymlです。MongoDB ExpressはMongoDB Serverの情報を表示します。
cat << 'EOF' > stack.yml version: '3.1' services: mongo: image: mongo restart: always environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: example mongo-express: image: mongo-express restart: always ports: - 8081:8081 environment: ME_CONFIG_MONGODB_ADMINUSERNAME: root ME_CONFIG_MONGODB_ADMINPASSWORD: example ME_CONFIG_MONGODB_URL: mongodb://root:example@mongo:27017/ EOF
コンテナを起動します。
docker-compose -f stack.yml up -d
ブラウザでtcp8081に接続すると、MongoDB Expressを閲覧する事ができます。
コンテナを削除します。
docker-compose -f stack.yml down