https://www.mongodb.com/docs/manual/release-notes/6.0-compatibility/#legacy-mongo-shell-removed
(1). DockerHubで公開されているMongoDBのコンテナイメージをダウンロードします。
$ docker pull mongo
(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の値は以降の手順でも使用するので控えておいてください。
(1). 以下のコマンドを実行し、起動したコンテナへ接続します。
$ docker exec -it {CONTAINER ID} bash
※CONTAINER IDには前項で確認したCONTAINER IDの値を入力します。
(2). コンテナ接続後、以下のコマンドを実行しMongoDBへログインします。
$ mongosh
※この状態では認証機能が有効になっていません。データの作成・更新・削除がだれでも行えるため、以降の手順ではMongoDBの認証機能の有効化の設定を行います。
(3). 以下のコマンドでログアウトします。
> exit
(1). 以下のコマンドを実行し、管理者ユーザーを作成します。
$ mongosh
> use admin
> db.createUser({user:"admin",pwd:"admin", roles:[{ role:"userAdminAnyDatabase", db:"admin" }]})
> exit
※ここで作成した管理者ユーザーの情報は以下になります。
ユーザー名:admin
パスワード:admin
(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の値を以降の手順でも使用します。
(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
(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
(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" }
以上で全ての手順は完了になります