Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Docker在MongoDB上启用身份验证?_Mongodb_Docker - Fatal编程技术网

如何通过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
进一步发展的更好解决方案:

这是我为同一个问题所做的,它起了作用

  • 在服务器上运行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

    参考-

  • 通过键入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
    
    mongo <ip>:27017/cool_db -u ian -p secretPassword
    
  • 现在在启用auth的情况下运行mongo docker

    docker run -d -p 27017:27017 -v ~/dataMongo:/data/db mongo mongod --auth
    
    参考:(乌斯曼·伊斯梅尔对这个问题的回答)

  • 我可以使用下面的命令从本地windows笔记本电脑连接到运行在Google云服务器上的实例

    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