我想启动一个docker,mongodb:latest
但只允许某些用户访问某些db(即启用--auth
).没有人应该访问mongodb!作为docker启动的一部分,我该如何做?
BTW,data directory
在启动期间使用以下命令位于主机上:-v /my/own/datadir:/data/db
.
如果你看看:
https://github.com/docker-library/mongo/blob/27f2722bb2ebd26354321adc8c3f19f7958529e1/3.4/Dockerfile
https://github.com/docker-library/mongo/blob/27f2722bb2ebd26354321adc8c3f19f7958529e1/3.4/docker-entrypoint.sh
你会注意到有两个变量用于docker-entrypoint.sh
:
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD
您可以使用它们来设置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."
将执行入口点脚本并将创建其他用户.
更好的解决方案:
https ://blog.madisonhub.org/setting-up-a-mongodb-server-with-auth-on-docker/ https://docs.mongodb.com/v2.6/tutorial/add -user管理员/
这就是我为同样的问题所做的,并且它起作用了.
在服务器上运行mongo docker实例
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo
在正在运行的docker实例上打开bash.
docker ps
容器IDIMAGE命令创建状态端口名称
b07599e429fb mongo"docker-entrypoint ..."35分钟前上涨35分钟0.0.0.0:27017->27017/tcp musing_stallman
docker exec -it b07599e429fb bash root@b07599e429fb:/#
参考 - https://github.com/arunoda/meteor-up-legacy/wiki/Accessing-the-running-Mongodb-docker-container-from-command-line-on-EC2
键入mongo输入mongo shell.
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
现在运行启用了auth的mongo docker.
docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
参考:如何通过Docker在MongoDB上启用身份验证?(Usman Ismail对这个问题的回答)
我能够使用以下命令从本地Windows笔记本电脑连接到在Google云服务器上运行的实例.
mongo:27017/cool_db -u ian -p secretPassword
参考:如何从Mac OS终端连接到远程mongo服务器
一种。您可以通过终端使用环境变量:
$ 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堆栈部署文件中使用环境变量,也可以在3.4至4.1版本的组合文件中使用环境变量。
正如官方mongo映像集的快速参考部分MONGO_INITDB_ROOT_USERNAME
以及MONGO_INITDB_ROOT_PASSWORD
您的yaml文件中所述:
mongo: image: mongo environment: MONGO_INITDB_ROOT_USERNAME: admin MONGO_INITDB_ROOT_PASSWORD: password
mongo映像中的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
脚本内切换数据库。
最后一种方法不在参考文档中,因此它可能无法在更新后保存下来。
官方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
只需将.js文件放入入口点init文件夹中即可
例如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。