MongoDB インストール (コンテナ編)

スポンサーリンク

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を閲覧する事ができます。

MongoDB Express

コンテナを削除します。

docker-compose -f stack.yml down
タイトルとURLをコピーしました