我想为mongodb:latest
启动一个docker,但只允许某些用户访问某些db(即启用--auth
)。没有人应该访问mongodb!作为docker启动的一部分,我该如何做?
BTW,data directory
在启动期间使用以下命令位于主机上:-v /my/own/datadir:/data/db
。
答案 0 :(得分:60)
如果你看看:
您会注意到docker-entrypoint.sh
中使用了两个变量:
您可以使用它们来设置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用户添加自定义用户,请使用入口点exectuable脚本(放置在$ docker-compose
下的$ PWD / mongo-entrypoint目录下到入口点):
#!/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."
将执行入口点脚本并创建其他用户。
答案 1 :(得分:14)
尝试时我很难过
所以我在这里做了 2020 个回答
我的目录如下
├── docker-compose.yml
└── mongo-entrypoint
└── entrypoint.js
我的docker-compose.yml
看起来像这样
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
请根据需要更改admin
和pass
。
在mongo-entrypoint
内,我有entrypoint.js
个文件,内容如下:
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",
}
)
再次需要在您之前声明的admin:pass
中将docker-compose.yml
更改为您的root mongo凭据。另外,您需要将new_db
,user
,pass
更改为所需的新数据库名称和凭据。
现在您可以:
docker-compose up -d
并从本地主机连接到该数据库,请注意,我已经有mongo cli,您可以安装它,也可以执行上述容器以使用mongo
命令:
mongo new_db -u user -p pass
或者您可以从其他计算机连接
mongo host:27017/new_db -u user -p pass
我的git存储库: https://github.com/sexydevops/docker-compose-mongo
希望它能对某人有所帮助,我为此而失去了下午;)
答案 2 :(得分:11)
更好的解决方案:
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
集装箱身份证明命令创建状态端口名称
b07599e429fb mongo" docker-entrypoint ..." 35分钟前上涨35分钟0.0.0.0:27017->27017/tcp musing_stallman
docker exec -it b07599e429fb bash
root@b07599e429fb:/#
输入mongo输入mongo shell。
root@b07599e429fb:/# mongo
在本例中,我将设置一个名为ian的用户,并将该用户设为read&写入对cool_db数据库的访问权。
> use cool_db
> db.createUser({
user: 'ian',
pwd: 'secretPassword',
roles: [{ role: 'readWrite', db:'cool_db'}]
})
从mongod shell和bash退出。
使用以下命令停止docker实例。
docker stop mongo
现在运行启用了auth的mongo docker。
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
参考:How to enable authentication on MongoDB through Docker?(Usman Ismail对这个问题的回答)
我可以使用以下命令从本地Windows笔记本电脑连接到Google云端服务器上运行的实例。
mongo <ip>:27017/cool_db -u ian -p secretPassword
参考:how can I connect to a remote mongo server from Mac OS terminal
答案 3 :(得分:8)
官方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
答案 4 :(得分:5)
我想发表评论,但信誉不够。
上面显示的用户添加可执行脚本必须用 -authenticationDatabase管理员和 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'}]});"
答案 5 :(得分:4)
@jbochniak:谢谢,虽然刚开始时我觉得我已经发现了所有这些,但事实证明你的例子(特别是Mongo Docker图片的版本)帮助了我!
该版本(v3.4.2)和v3.4(目前对应于v3.4.3)仍然支持“MONGO_INITDB_ROOT”&#39;通过这些变量指定,从v3.5开始(至少标签&#39; 3&#39;和#39;最新&#39;)在你的答案中按照描述工作并在文档中。
我很快看了一下GitHub上的代码,但看到了这些变量的类似用法并且无法立即找到错误,应该在将其作为错误提交之前这样做...
答案 6 :(得分:4)
a。您可以通过终端使用环境变量:
$ docker run -d --name container_name \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
mongo
b。您可以在Docker堆栈部署文件中使用环境变量,也可以在3.4至4.1版本的Compose文件中使用环境变量。
如您的Yaml文件中的official mongo image集MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
的快速参考部分所述:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
mongo image中的 docker-entrypoint.sh文件检查这两个变量是否存在,并相应地设置--auth
标志。
c。您还可以使用Docker机密。
MONGO_INITDB_ROOT_USERNAME
和MONGO_INITDB_ROOT_PASSWORD
由docker-entrypoint.sh从MONGO_INITDB_ROOT_USERNAME_FILE
和MONGO_INITDB_ROOT_PASSWORD_FILE
变量间接设置:
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使用MONGO_INITDB_DATABASE
变量指定的数据库执行,否则进行测试。您也可以在.js
脚本中切换数据库。
最后一个方法不在参考文档中,因此它可能无法在更新后保存下来。
答案 7 :(得分:3)
将.js文件放入入口点init文件夹只适用于此
e.g。 entrypoint.js
var db = connect("mongodb://localhost/admin");
db.createUser(
{
user: "yourAdminUserName",
pwd: "yourAdminPassword",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
搬运工-compose.yml:
db:
image: mongo:3.2
volumes:
- /my/own/datadir:/data/db
- ../mongo-entrypoint:/docker-entrypoint-initdb.d
手工完成其余的工作或更多相同的工作。
如果您愿意,还可以将.sh文件放入init文件夹中以清理文件,使它们不会存在:zz-cleanup.sh。
答案 8 :(得分:2)
使用此图片修复:
使用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
答案 9 :(得分:1)
您可以使用env变量为mongo设置用户名和密码
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD
使用简单的docker命令
docker run -e MONGO_INITDB_ROOT_USERNAME=my-user MONGO_INITDB_ROOT_PASSWORD=my-password mongo
使用docker-compose
version: '3.1'
services:
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: my-user
MONGO_INITDB_ROOT_PASSWORD: my-password
最后一个选项是手动访问容器,并在mongo docker容器内设置用户和密码
docker exec -it mongo-container bash
现在您可以使用mongo shell命令配置所需的一切