mongodb:latest
のドッカーをスピンアップしますが、特定のユーザーのみが特定のdbにアクセスできるようにします(つまり、--auth
を有効にします)。誰もmongodbにアクセスしないでください! Docker開始の一部としてこれを行うにはどうすればよいですか?
ところで、data directory
は、開始時に次のコマンドを使用することでホストに配置されます:-v /my/own/datadir:/data/db
。
あなたが見てみると:
docker-entrypoint.sh
には2つの変数が使用されていることがわかります。
これらを使用して、rootユーザーをセットアップできます。たとえば、次のdocker-compose.yml
ファイルを使用できます。
mongo-container:
image: mongo:3.4.2
environment:
# provide your credentials here
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=rootPassXXX
ports:
- "27017:27017"
volumes:
# if you wish to setup additional user accounts specific per DB or with different roles you can use following entry point
- "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
# no --auth is needed here as presence of username and password add this option automatically
command: mongod
docker-compose up
でコンテナを起動すると、次のエントリに気付くはずです。
...
I CONTROL [initandlisten] options: { net: { bindIp: "127.0.0.1" }, processManagement: { fork: true }, security: { authorization: "enabled" }, systemLog: { destination: "file", path: "/proc/1/fd/1" } }
...
I ACCESS [conn1] note: no users configured in admin.system.users, allowing localhost access
...
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
Root以外のカスタムユーザーを追加するには、entpointpoint exectuableスクリプト(docker-compose
でentrypointにマウントされているため、$ PWD/mongo-entrypoint dirの下に配置)を使用します。
#!/usr/bin/env bash
echo "Creating mongo users..."
mongo admin --Host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED --eval "db.createUser({user: 'ANOTHER_USER', pwd: 'PASS', roles: [{role: 'readWrite', db: 'xxx'}]}); db.createUser({user: 'admin', pwd: 'PASS', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});"
echo "Mongo users created."
エントリポイントスクリプトが実行され、追加のユーザーが作成されます。
推進のためのより良いソリューション:
https://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/https:// docs。 mongodb.com/v2.6/tutorial/add-user-administrator/
同じ問題に対して私がやったことはここにあり、それはうまくいった。
サーバーでmongo dockerインスタンスを実行します
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
実行中のdockerインスタンスでbashを開きます。
docker ps
コンテナーIDコマンド作成ステータスポート名
b07599e429fb mongo "docker-entrypoint ..." 35分前アップ35分0.0.0.0:27017->27017/tcp musing_stallman
docker exec -it b07599e429fb bash
root@b07599e429fb:/#
Mongoと入力してmongoシェルに入ります。
root@b07599e429fb:/# mongo
この例では、ianという名前のユーザーを設定し、そのユーザーにcool_dbデータベースへの読み取りおよび書き込みアクセスを許可します。
> use cool_db
> db.createUser({
user: 'ian',
pwd: 'secretPassword',
roles: [{ role: 'readWrite', db:'cool_db'}]
})
参照: https://ianlondon.github.io/blog/mongodb-auth/ (最初のポイントのみ)
Mongod Shellとbashを終了します。
以下のコマンドを使用して、Dockerインスタンスを停止します。
docker stop mongo
認証を有効にしてmongo dockerを実行します。
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
リファレンス: Dockerを介してMongoDBで認証を有効にする方法 (この質問に対するUsman Ismailの回答)
以下のコマンドを使用して、ローカルのWindowsラップトップからGoogle Cloudサーバーで実行されているインスタンスに接続できました。
mongo <ip>:27017/cool_db -u ian -p secretPassword
公式のmongoイメージのDockerfileは here です。デフォルトのコマンドはmongodですが、ユーザーがすでに設定されていると仮定して、上書きして--authスイッチを追加できます。
docker run -d .... mongodb:latest mongod --auth
ユーザーを作成する必要がある場合は、スタートアップスクリプトを/entrypoint.sh
にボリュームマウントしてデフォルトのスタートアップスクリプトを置き換え、そのスクリプトでユーザーを作成し、authスイッチでmongoを起動する必要があります。
docker run -d .... -v $PWD/my_custom_script.sh:/entrypoint.sh mongodb:latest
a。ターミナル経由で環境変数を使用できます:
$ docker run -d --name container_name \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
mongo
すべてが機能するかどうかをテストする場合:
// ssh into the running container
// Change container name if necessary
$ docker exec -it mongo /bin/bash
// Enter into mongo Shell
$ mongo
// Caret will change when you enter successfully
// Switch to admin database
$> use admin
$> db.auth("admin", "password")
// Show available databases
$> show dbs
初回実行時にデータベースをインスタンス化する場合は、オプションbをオンにします。
b。バージョン3.4から4.1のdockerスタックデプロイファイルまたは構成ファイルで環境変数を使用できます。
公式mongoイメージ のクイックリファレンスセクションで説明されているように、yamlファイルでMONGO_INITDB_ROOT_USERNAME
およびMONGO_INITDB_ROOT_PASSWORD
を設定します。
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
docker-entrypoint.sh mongoイメージ内のファイルは、これら2つの変数の存在をチェックし、それに応じて--auth
フラグを設定します。
c。ドッカーシークレットを使用することもできます。
MONGO_INITDB_ROOT_USERNAME
およびMONGO_INITDB_ROOT_PASSWORD
は、MONGO_INITDB_ROOT_USERNAME_FILE
およびMONGO_INITDB_ROOT_PASSWORD_FILE
変数からdocker-entrypoint.shによって間接的に設定されます。
mongo:
image: mongo
environment:
- MONGO_INITDB_ROOT_USERNAME_FILE=/run/secrets/db_root_username
- MONGO_INITDB_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
secrets:
- db_root_username
- db_root_password
docker-entrypoint.shは、MONGO_INITDB_ROOT_USERNAME_FILE
およびMONGO_INITDB_ROOT_PASSWORD_FILE
をMONGO_INITDB_ROOT_USERNAME
およびMONGO_INITDB_ROOT_PASSWORD
に変換します。
データベースインスタンスの初期化中に、MONGO_INITDB_ROOT_USERNAME
フォルダー内のMONGO_INITDB_ROOT_PASSWORD
または.sh
スクリプトで.js
およびdocker-entrypoint-initdb.d
を使用できます。
コンテナを初めて起動すると、.sh
にある拡張子.js
および/docker-entrypoint-initdb.d
のファイルが実行されます。ファイルはアルファベット順に実行されます。 .js
ファイルは、MONGO_INITDB_DATABASE
変数で指定されたデータベースが存在する場合、それを使用してmongoによって実行されるか、そうでない場合はテストされます。 .js
スクリプト内でデータベースを切り替えることもできます。
この最後の方法はリファレンスドキュメントに含まれていないため、更新後も存続しない場合があります。
コメントしたいのですが、評判が足りません。
上記のユーザー追加実行可能スクリプトは、-authenticationDatabase adminおよびNEWDATABASENAMEで変更する必要があります。
mongo --authenticationDatabase admin --Host localhost -u USER_PREVIOUSLY_DEFINED -p PASS_YOU_PREVIOUSLY_DEFINED NEWDATABASENAME --eval "db.createUser({user: 'NEWUSERNAME', pwd: 'PASSWORD', roles: [{role: 'readWrite', db: 'NEWDATABASENAME'}]});"
エントリポイントのinitフォルダーに.jsファイルをドロップするだけで機能します
例えばentrypoint.js
var db = connect("mongodb://localhost/admin");
db.createUser(
{
user: "yourAdminUserName",
pwd: "yourAdminPassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
docker-compose.yml:
db:
image: mongo:3.2
volumes:
- /my/own/datadir:/data/db
- ../mongo-entrypoint:/docker-entrypoint-initdb.d
残りの作業を手作業で行うか、同じ作業を続けます。
必要に応じて、.shファイルをinitフォルダーにドロップして、ファイルが整理されないようにクリーンアップすることもできます:zz-cleanup.sh。
@jbochniak:ありがとう、最初読んで私はすでにこのすべてを発見したと思っていましたが、あなたの例(特にMongo Dockerイメージのバージョン)が私を助けてくれました!
そのバージョン(v3.4.2)およびv3.4(現在はv3.4.3に対応)は、これらの変数で指定された 'MONGO_INITDB_ROOT'を引き続きサポートしていますv3.5以降(少なくともタグ '3'および 'latest' )説明どおりに機能しない回答およびドキュメントで。
私はすぐにGitHubのコードを見ましたが、これらの変数の同様の使用法を見て、すぐにバグを見つけることができませんでした、バグとしてこれを提出する前にそうするべきです...
この画像を使用して修正します。
Docker-compose.ymlを使用
services:
db:
image: aashreys/mongo-auth:latest
environment:
- AUTH=yes
- MONGODB_ADMIN_USER=admin
- MONGODB_ADMIN_PASS=admin123
- MONGODB_APPLICATION_DATABASE=sample
- MONGODB_APPLICATION_USER=aashrey
- MONGODB_APPLICATION_PASS=admin123
ports:
- "27017:27017"
// more configuration