给docker的官方mongo镜像添加认证登录

来源:互联网 发布:mean it 编辑:程序博客网 时间:2024/05/22 16:04

给docker的官方mongo镜像添加认证登录

首先给出docker官方的mongo镜像库的Dockerfile

mongo:3.1.7版本的Dockeifile如下:

FROM debian:wheezy# add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get addedRUN groupadd -r mongodb && useradd -r -g mongodb mongodbRUN apt-get update \    && apt-get install -y --no-install-recommends \        ca-certificates curl \        numactl \    && rm -rf /var/lib/apt/lists/*# grab gosu for easy step-down from rootRUN gpg --keyserver ha.pool.sks-keyservers.net --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4RUN curl -o /usr/local/bin/gosu -SL "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture)" \    && curl -o /usr/local/bin/gosu.asc -SL "https://github.com/tianon/gosu/releases/download/1.2/gosu-$(dpkg --print-architecture).asc" \    && gpg --verify /usr/local/bin/gosu.asc \    && rm /usr/local/bin/gosu.asc \    && chmod +x /usr/local/bin/gosu# pub   4096R/04A2163B 2015-06-23 [expires: 2017-06-22]#       Key fingerprint = 13AC B91D 285D D025 66BB  4116 614D 9855 04A2 163B# uid                  MongoDB 3.2 Release Signing Key <packaging@mongodb.com>RUN apt-key adv --keyserver ha.pool.sks-keyservers.net --recv-keys 13ACB91D285DD02566BB4116614D985504A2163BENV MONGO_MAJOR 3.1ENV MONGO_VERSION 3.1.7RUN echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/$MONGO_MAJOR main" > /etc/apt/sources.list.d/mongodb-org.listRUN set -x \    && apt-get update \    && apt-get install -y \        mongodb-org-unstable=$MONGO_VERSION \        mongodb-org-unstable-server=$MONGO_VERSION \        mongodb-org-unstable-shell=$MONGO_VERSION \        mongodb-org-unstable-mongos=$MONGO_VERSION \        mongodb-org-unstable-tools=$MONGO_VERSION \    && rm -rf /var/lib/apt/lists/* \    && rm -rf /var/lib/mongodb \    && mv /etc/mongod.conf /etc/mongod.conf.origRUN mkdir -p /data/db && chown -R mongodb:mongodb /data/dbVOLUME /data/dbCOPY docker-entrypoint.sh /entrypoint.shENTRYPOINT ["/entrypoint.sh"]EXPOSE 27017CMD ["mongod"]

从该Dockerfile中可以看出镜像制作的非常简单,对mongo无法做任何配置,只能指定mongo数据持久化到宿主机的哪一个目录中,做数据的永久保存配置。

但是想要给数据库添加登录认证该怎么办呢,下面给出一种较简单的:

1.首先是获取镜像,以3.1.7版本的为例。

docker pull mongo:3.1.7

2.然后启动一个容器

docker run -v ~/data:/data/db -p 27017:27017 --name mongodb -d mongo:3.1.7

3.使用exec命令进入容器

docker exec -it mongodb /bin/bash

4.在容器内修改容器的一些内容

cp -rf entrypoint.sh /data/db           #将文件拷贝到宿主机的~/data目录下vim entrypoint.sh   #宿主机上修改该文件  在exec gosu mongodb "$@"之前加一行    set -- "$@" " --auth"cp -rf /data/db/entrypoint.sh .         #将修改完的entrypoint.sh文件覆盖根目录下的entrypoint.sh文件mongo                                   #进入mongo操作数据库use admin                               #使用admin数据库var schema = db.system.version.findOne({"_id" : "authSchema"})  #找出mongo认证的版本schema.currentVersion = 3               #设置版本为3(默认为5)db.system.version.save(schema)          #保存#如果不设置这一段,在登录的时候会报错:http://stackoverflow.com/questions/29006887/mongodb-cr-authentication-faileddb.createUser({user:"admin",pwd:"admin",roles: [{role: "root",db: "admin"}]});#创建一个管理员账户db.auth('admin','admin')                #测试认证,如果返回1,代表认证成功exit                                    #退出mongo客户端exit                                    #退出mongodb容器

4.保存对容器所做的修改

docker commit mongodb meihuabo:mongo:3.1.7  #将容器所做的修改保存到meihuabo/mongo:3.1.7该镜像中

5.创建新的需要认证的容器

docker stop mongodb             #停止mongodb容器docker rm mongodb               #删除mongodb容器docker run -v ~/data:/data/db -p 27017:27017 --name mongodb -d meihuabo/mongo:3.1.7

至此一个需要登录验证的mongo容器已经制作完成。

在该过程中碰到的坑:
1.就是验证权限机制问题,默认的是5,在那个情况下创建出来的用户,只能在client里面认证,用java或者MongoVUE等可视化工具连接时,会报 :

Connection was refusedUnable to connect to server *.*.*.*:27017: Invalid credential for database 'admin'..Type: MongoDB.Driver.MongoConnectionExceptionStack:    在 MongoDB.Driver.Internal.DirectMongoServerProxy.Connect(TimeSpan timeout, ReadPreference readPreference)   在 MongoDB.Driver.MongoServer.Connect(TimeSpan timeout)   在 MongoDB.Driver.MongoServer.Connect()   在 MangoUI.MMongo.Open(Boolean mustWrite)   在 MangoUI.MMongo.Open()   在 MangoUI.MConnection.get_IsValid()   在 MangoUI.WinConnect.btnTest_Click(Object sender, EventArgs e)Invalid credential for database 'admin'.Type: MongoDB.Driver.MongoAuthenticationExceptionStack:    在 MongoDB.Driver.Communication.Security.MongoCRAuthenticationProtocol.Authenticate(MongoConnection connection, MongoCredential credential)   在 MongoDB.Driver.Communication.Security.Authenticator.Authenticate(MongoCredential credential)   在 MongoDB.Driver.Communication.Security.Authenticator.Authenticate()   在 MongoDB.Driver.Internal.MongoConnection.Open()   在 MongoDB.Driver.Internal.MongoConnection.GetNetworkStream()   在 MongoDB.Driver.Internal.MongoConnection.SendMessage(BsonBuffer buffer, Int32 requestId)   在 MongoDB.Driver.Internal.MongoConnection.SendMessage(MongoRequestMessage message)   在 MongoDB.Driver.Operations.CommandOperation`1.Execute(MongoConnection connection)   在 MongoDB.Driver.MongoServerInstance.RunCommandAs[TCommandResult](MongoConnection connection, String databaseName, IMongoCommand command)   在 MongoDB.Driver.MongoServerInstance.Ping(MongoConnection connection)   在 MongoDB.Driver.MongoServerInstance.Connect()   在 MongoDB.Driver.Internal.DirectMongoServerProxy.Connect(TimeSpan timeout, ReadPreference readPreference)Command 'authenticate' failed: auth failed (response: { "ok" : 0.0, "errmsg" : "auth failed", "code" : 18 })Type: MongoDB.Driver.MongoCommandExceptionStack:    在 MongoDB.Driver.Operations.CommandOperation`1.Execute(MongoConnection connection)   在 MongoDB.Driver.Communication.Security.MongoCRAuthenticationProtocol.RunCommand(MongoConnection connection, String databaseName, IMongoCommand command)   在 MongoDB.Driver.Communication.Security.MongoCRAuthenticationProtocol.Authenticate(MongoConnection connection, MongoCredential credential)Inputs:: Command:  authenticateOk:       FalseErrorMsg: auth failedRequest:  { "authenticate" : 1, "user" : "root", "nonce" : "69d9feef6ce61884", "key" : "75cba0baf790d6f79003726e3f6bb74c" }Response: { "ok" : 0.0, "errmsg" : "auth failed", "code" : 18 }

的错误,但是密码明明就是正确的,在client里面验证结果也为1。后来将验证机制改为3,重新创建管理员用户,就能成功登录了。

说明:以上的容器制作并不是一个很好的选择,正确的是克隆一个https://github.com/docker-library/mongo项目,根据自己的需求,定制一份Dockerfile。

1 0