说明,我这里使用的是compose的版本的1.17.0格式是3,但是这和compose版本无关,你只需要添加MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD到你的环境变量中即可。


#使用官方mongo:3.2的image,compose文件如下,其中当你加入环境变量MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD(缺一不可)后mongodb自动开启权限验证,这在mongo官方镜像文件的docker-entrypoint.sh脚本中可看到https://github.com/docker-library/mongo/blob/00a8519463e776e797c227681a595986d8f9dbe1/3.0/docker-entrypoint.sh

version: '3'
services:
  mongo:
    image: mongo:3.2
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db
    networks:
      - backend
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root.123
volumes:
  mongo-data:
networks:
  backend:


#创建服务,我这里使用的是swarm集群
docker stack  deploy gionee -c=./docker-compose.yml


#进入容器内部,mongo容器id自行查看
docker exec -it 7c10b03dcf3a /bin/bash


#执行mongo命令
mongo


#首先使用命令show dbs查看是否开启鉴权,如果看到
2017-11-29T07:46:27.950+0000 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13

说明已经开启鉴权,继续往下走。如果没有看到错误提示,说明mongo没有默认开启鉴权,应该检查你的compose.yml的MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD格式是否正确,yml语法非常严格


#默认是进入test数据库,需要切换到admin数据库
use admin


#添加admin用户
db.createUser( {
 user: "admin",
 pwd: "123456",
 roles: [ {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }, 
        {
            "role" : "readWriteAnyDatabase",
            "db" : "admin"
        }, 
        {
            "role" : "dbAdminAnyDatabase",
            "db" : "admin"
        } ]
});


#登录admin用户
db.auth("admin","123456")


#进入你想要添加用户的数据库,切记要切换你想要操作的数据库,我这里是smartdb
use smartdb


#添加用户,指定权限和数据库readWrite表示读写权限
db.createUser(
     {
       user: "smart",
       pwd: "123456",
       roles: [
          { role: "readWrite", db: "smartdb" }
       ]
     }
 )


#验证用户否可用,如果返回1说明成功
db.auth("smart","123456")
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐