如何通过Docker在MongoDB上启用身份验证?
我想为如何通过Docker在MongoDB上启用身份验证?,mongodb,docker,Mongodb,Docker,我想为mongodb:latest启动一个docker,但只允许某些用户访问某些数据库(即启用--auth)。任何人都不应该访问mongodb!作为docker入门的一部分,我应该如何做 顺便说一句,data directory通过在启动期间使用以下命令位于主机上:-v/my/own/datadir:/data/db官方mongo映像的Dockerfile是。默认命令是mongod,但您可以重写以添加--auth开关,前提是已经配置了用户的 docker run -d .... mongodb:
mongodb:latest
启动一个docker,但只允许某些用户访问某些数据库(即启用--auth
)。任何人都不应该访问mongodb!作为docker入门的一部分,我应该如何做
顺便说一句,
data directory
通过在启动期间使用以下命令位于主机上:-v/my/own/datadir:/data/db
官方mongo映像的Dockerfile是。默认命令是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
如果你看一下:
docker entrypoint.sh
中使用了两个变量:
- MONGO\u INITDB\u ROOT\u用户名
- MONGO\u INITDB\u ROOT\u密码
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用户之外,请使用entrypoint可执行脚本(当它装入docker compose
到entrypoint时,放在$PWD/mongo entrypoint dir下):
将执行Entrypoint脚本并创建其他用户。@jbochniak:谢谢,虽然起初我以为我已经发现了所有这些,但事实证明,您的示例(尤其是Mongo Docker图像的版本)帮助了我 该版本(v3.4.2)和v3.4(目前对应于v3.4.3)仍然支持通过这些变量指定的“MONGO_INITDB_ROOT”,而从v3.5开始(至少标记为“3”和“最新”)就不能像您的答案和文档中描述的那样工作
我很快查看了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
这是我为同一个问题所做的,它起了作用
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
docker ps
容器IDIMAGE命令已创建状态端口名称
b07599e429fb mongo“docker entrypoint…”35分钟前上升35分钟0.0.0.0:27017->27017/tcp musing_stallman
参考-root@b07599e429fb:/# mongo
> use cool_db
> db.createUser({
user: 'ian',
pwd: 'secretPassword',
roles: [{ role: 'readWrite', db:'cool_db'}]
})
参考:(仅第一点)docker stop mongo
mongo <ip>:27017/cool_db -u ian -p secretPassword
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
参考:(乌斯曼·伊斯梅尔对这个问题的回答)docker stop mongo
mongo <ip>:27017/cool_db -u ian -p secretPassword
mongo:27017/cool_db-u ian-p秘密密码
参考:只需将一个.js文件放入入口点init文件夹就可以了 e、 g.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 我想发表评论,但没有足够的声誉 上面显示的添加可执行脚本的用户必须使用 --authenticationDatabase admin和新建数据库名
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'}]});"
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", passwordPrompt())
// Show available databases
$> show dbs
如果希望在第一次运行时实例化数据库,请选中选项b
b。您可以在docker stack部署文件中使用环境变量,也可以在3.4到4.1版本的compose文件中使用环境变量。
正如yaml文件中设置的MONGO_INITDB_ROOT_用户名
和MONGO_INITDB_ROOT_密码
的快速参考部分所述:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
mongo image中的文件检查这两个变量是否存在,并相应地设置--auth
标志
c。您还可以使用docker机密。
MONGO_INITDB_ROOT_用户名
和MONGO_INITDB_ROOT_密码
由docker-entrypoint.sh从MONGO_INITDB_ROOT_用户名文件
和MONGO_INITDB_ROOT_密码文件
变量间接设置:
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\u INITDB\u ROOT\u用户名文件
和MONGO\u INITDB\u ROOT\u密码文件
转换为MONGO\u INITDB\u ROOT\u用户名
和MONGO\u INITDB\u ROOT\u密码
初始化数据库实例时,您可以在.sh
或.js
文件夹中使用MONGO\u INITDB\u ROOT\u用户名和MONGO\u INITDB\u ROOT\u密码
docker ps
当容器第一次启动时,它将执行扩展名为.sh
和.js
的文件,这些文件位于/docker entrypoint initdb.d
中。文件将按字母顺序执行.js
文件将由mongo使用mongo_INITDB_database
变量指定的数据库(如果存在)执行,否则测试。您还可以在.js
脚本中切换数据库
最后一种方法不在参考文档中,因此可能无法在更新后继续使用
version: '3.4'
services:
mongo-container:
# If you need to connect to your db from outside this container
network_mode: host
image: mongo:4.2
environment:
- MONGO_INITDB_ROOT_USERNAME=admin
- MONGO_INITDB_ROOT_PASSWORD=pass
ports:
- "27017:27017"
volumes:
- "$PWD/mongo-entrypoint/:/docker-entrypoint-initdb.d/"
command: mongod
var db = connect("mongodb://admin:pass@localhost:27017/admin");
db = db.getSiblingDB('new_db'); // we can not use "use" statement here to switch db
db.createUser(
{
user: "user",
pwd: "pass",
roles: [ { role: "readWrite", db: "new_db"} ],
passwordDigestor: "server",
}
)
docker-compose up -d
mongo new_db -u user -p pass
mongo host:27017/new_db -u user -p pass
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD
docker run -e MONGO_INITDB_ROOT_USERNAME=my-user MONGO_INITDB_ROOT_PASSWORD=my-password mongo
version: '3.1'
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: my-user
MONGO_INITDB_ROOT_PASSWORD: my-password
docker exec -it mongo-container bash