我想启动一个docker,mongodb:latest但只允许某些用户访问某些db(即启用--auth).没有人应该访问mongodb!作为docker启动的一部分,我该如何做?
BTW,data directory在启动期间使用以下命令位于主机上:-v /my/own/datadir:/data/db.
jbo*_*iak 72
如果你看看:
你会注意到有两个变量用于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."
将执行入口点脚本并将创建其他用户.
Cha*_*ang 25
我在尝试时很难
所以我在这里做了2021 年的回答
我的目录看起来像这样
??? 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之前声明的根 mongo 凭据。在另外你需要改变new_db,user,pass到新的数据库名称和凭据,你所需要的。
现在你可以:
docker-compose up -d
并从localhost连接到这个db,请注意我已经有了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
希望它可以帮助某人,我为此失去了下午;)
San*_*san 19
更好的解决方案:
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:/#
键入mongo输入mongo shell.
root@b07599e429fb:/# mongo
对于此示例,我将设置一个名为ian的用户,并为该用户提供对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
参考:如何通过Docker在MongoDB上启用身份验证?(Usman Ismail对这个问题的回答)
我能够使用以下命令从本地Windows笔记本电脑连接到在Google云服务器上运行的实例.
mongo <ip>:27017/cool_db -u ian -p secretPassword
Snn*_*Snn 12
一种。您可以通过终端使用环境变量:
$ 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.jsdocker-entrypoint-initdb.d
当容器启动首次它将与扩展执行文件.sh和.js那个被发现在/docker-entrypoint-initdb.d。文件将按字母顺序执行。.jsmongo将使用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
使用此图像来修复:
使用 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
小智 6
我想发表评论,但没有足够的声誉。
必须使用--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'}]});"
https://i.stack.imgur.com/MdyXo.png
小智 5
@jbochniak:谢谢,虽然在第一次阅读时我以为我已经发现了所有这些,但事实证明您的示例(尤其是 Mongo Docker 映像的版本)帮助了我!
该版本 (v3.4.2) 和 v3.4(当前对应于 v3.4.3)仍然支持通过这些变量指定的“MONGO_INITDB_ROOT”,从 v3.5 开始(至少标签“3”和“最新”)不要按照您的回答和文档中的描述工作。
我很快查看了 GitHub 上的代码,但看到这些变量的类似用法并且无法立即找到错误,应该在将其作为错误提交之前这样做......
只需将.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。
您可以使用环境变量来设置 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 命令来配置你想要的一切
| 归档时间: | 
 | 
| 查看次数: | 60838 次 | 
| 最近记录: |