N-LAB

MongoDB 6.0をDockerコンテナ上で環境構築する方法


目標


前提


注意点

https://www.mongodb.com/docs/manual/release-notes/6.0-compatibility/#legacy-mongo-shell-removed

目次

  1. MongoDBコンテナイメージのダウンロード
  2. MongoDBのコンテナの作成・起動
  3. MongoDBのコンテナ接続
  4. 管理者ユーザーの作成
  5. 認証機能の有効化
  6. 一般ユーザーの作成
  7. ドキュメントの作成
  8. 認証機能の確認


1. MongoDBコンテナイメージのダウンロード

(1). DockerHubで公開されているMongoDBのコンテナイメージをダウンロードします。

$ docker pull mongo


2. MongoDBのコンテナの作成・起動

(1). 以下のコマンドを実行し、コンテナを起動します。バックグラウンドで実行するため-dオプションを記述します。

$ docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo

※データの永続化のため、ホスト側のマウント先には「~/dataMongo」を指定しています。コンテナ上で作ったファイル・データ等が保存さます。

(2). 以下のコマンドを実行し、MongoDBのコンテナ作成・起動が正しく行えたか確認します。

$ docker ps


(3). 正しく起動していた場合以下のような結果が表示されます。

CONTAINER ID	IMAGE	COMMAND	                CREATED	        STATUS	        PORTS	                    NAMES
XXXXXXXX	    mongo	"docker-entrypoint.s…"	30 minutes ago	Up 29 minutes	0.0.0.0:27017->27017/tcp	gallant_sammet

※CONTAINER IDの値は以降の手順でも使用するので控えておいてください。

3. MongoDBのコンテナ接続

(1). 以下のコマンドを実行し、起動したコンテナへ接続します。

$ docker exec -it {CONTAINER ID} bash

※CONTAINER IDには前項で確認したCONTAINER IDの値を入力します。

(2). コンテナ接続後、以下のコマンドを実行しMongoDBへログインします。

$ mongosh

※この状態では認証機能が有効になっていません。データの作成・更新・削除がだれでも行えるため、以降の手順ではMongoDBの認証機能の有効化の設定を行います。

(3). 以下のコマンドでログアウトします。

> exit


4. 管理者ユーザーの作成

(1). 以下のコマンドを実行し、管理者ユーザーを作成します。

$ mongosh
> use admin
> db.createUser({user:"admin",pwd:"admin", roles:[{ role:"userAdminAnyDatabase", db:"admin" }]})
> exit

※ここで作成した管理者ユーザーの情報は以下になります。
ユーザー名:admin
パスワード:admin

5. 認証機能の有効化

(1). 「2. MongoDBのコンテナの作成・起動」で起動したMongoDBのコンテナを停止します。

$ docker stop {CONTAINER ID}

※CONTAINER IDには「2. MongoDBのコンテナの作成・起動」で確認したCONTAINER IDの値を入力します。

(2). 認証機能を有効化してコンテナを起動します。

$ docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth


(3). 起動したコンテナのコンテナIDを確認します。

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                      NAMES
XXXXXXXXXXXX   mongo     "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds   0.0.0.0:27017->27017/tcp   compassionate_merkle

※ここで表示されたCONTAINER IDの値を以降の手順でも使用します。

6. 一般ユーザーの作成

(1). 管理者ユーザーでログインします。

$ docker exec -it {CONTAINER ID} bash
$ mongosh
> use admin
> db.auth("admin", "admin")


(2). データベースを新規作成します。ここでは新規作成するデータベース名を「target_db」としています。

> use target_db


(3). 一般ユーザーを作成し、readとwriteの権限をtarget_dbデータベースに対して与えます。

> db.createUser({user:"common_user",pwd:"common_user", roles:[{ role:"readWrite", db:"target_db" }]})
> exit

※ここで作成した一般ユーザーの情報は以下になります。
ユーザー名:common_user
パスワード:common_user

7. ドキュメントの作成

(1). 一般ユーザーでログインします。

$ mongosh -u common_user -p common_user --authenticationDatabase "target_db"


(2). ドキュメントを挿入します。

> use target_db
> db.member.insertMany([{ "user1" : "foo" }, { "user2" : "bar" }])


(3). コレクションの確認をします。memberが表示されることを確認します。

> show collections
member


(4). ドキュメントの確認をします。追加したドキュメントが表示されることを確認します。

> db.member.find()
[
  { _id: ObjectId("6438c8c5d5205a850b45893c"), user1: 'foo' },
  { _id: ObjectId("6438c8c5d5205a850b45893d"), user2: 'bar' }
]
> exit


8. 認証機能の確認

(1). MongoDBへログインします。

$ mongosh


(2). ドキュメントを挿入します。

> use target_db
> db.member.insertMany([{ "user1" : "foo" }, { "user2" : "bar" }])


(3). 認証されていないため、以下のエラーが表示されることを確認します。

Uncaught:
MongoBulkWriteError: command insert requires authentication
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {
    '0': ObjectId("6438cedea82e71897e81507c"),
    '1': ObjectId("6438cedea82e71897e81507d")
  }
}
Write Errors: []


(4). また、以下のコマンドを実行してもエラーが表示されることも確認してください。

> show collections
MongoServerError: command listCollections requires authentication
> db.member.find()
MongoServerError: command find requires authentication
> exit


(1). まず初めに新たに一般ユーザーを作成します。

$ mongosh
> use admin
> db.auth("admin", "admin")
> use another_db
> db.createUser({user:"another_user",pwd:"another_user", roles:[{ role:"readWrite", db:"another_db" }]})
> exit


(2). 作成した一般ユーザーでログインします。

$ mongosh -u another_user -p another_user --authenticationDatabase "another_db"


(3). ドキュメントを挿入します。

> use target_db
> db.member.insertMany([{ "user1" : "foo" }, { "user2" : "bar" }])


(4). 操作権限をもたないため、以下のエラーが表示されることを確認します。

Uncaught:
MongoBulkWriteError: not authorized on target_db to execute command { insert: "member", documents: 2, ordered: true, lsid: { id: UUID("537c019a-6dae-40f2-a2ff-4911b21d2ec6") }, $db: "target_db" }
Result: BulkWriteResult {
  insertedCount: 0,
  matchedCount: 0,
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 0,
  upsertedIds: {},
  insertedIds: {
    '0': ObjectId("6438d11dfac71da98eef8525"),
    '1': ObjectId("6438d11dfac71da98eef8526")
  }
}
Write Errors: []


(5). また、以下のコマンドを実行してもエラーが表示されることも確認してください。

> show collections
MongoServerError: not authorized on target_db to execute command { listCollections: 1, filter: {}, cursor: {}, nameOnly: true, authorizedCollections: false, lsid: { id: UUID("537c019a-6dae-40f2-a2ff-4911b21d2ec6") }, $db: "target_db", $readPreference: { mode: "primaryPreferred" } }
> db.member.find()
MongoServerError: not authorized on target_db to execute command { find: "member", filter: {}, lsid: { id: UUID("537c019a-6dae-40f2-a2ff-4911b21d2ec6") }, $db: "target_db" }



以上で全ての手順は完了になります