docker安装mongodb配置及踩坑记录(创建用户、授权访问)
问题:使用docker pull mongo命令下拉最新镜像后,直接docker run 指定别名和端口映射规则,运行容器后,发现使用docker exec 进入容器后,无法执行mongo命令,故在linux下载mongo服务工具,一通操作后,发现即使设置密码,并在配置加上安全认证,也可以无密码进行连接。
实践解决方法:下拉指定版本mongodb 本次 docker pull mongo:4.4.0
- 创建指定mongod数据挂载文件夹
mkdir /home/mongodb/data mkdir /home/mongodb/backup
之后授权访问时会用到,因为要创建两个docker镜像。
- 运行容器
docker run --name mongo -p 27017:27017 -v /home/mongodb/data:/data/db -v /home/mongodb/backup:/data/backup -d mongo
docker stop mongo
docker run --name mongodb -p 27017:27017 -v /home/mongodb/data:/data/db -v /home/mongodb/backup:/data/backup -d mongo --auth
docker stop mongodbmongodb 镜像指定了 --auth 选项,表示连接 mongodb 需要用户认证。默认不指定(云服务器数据库极易被黑),表示不用密码即可连接数据库,
- 运行mongo容器,并创建用户(此处直接指定root,还有其他多种 role 权限)
docker exec -it mongo /bin/bash mongo use admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) exit
或者直接进入
docker exec -it mongo mongo admin db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) exit
此处就是遇到开头出现的问题,无法执行 mongo命令 ,用mongodb:4.4.0可以这样使用,更高版本尚未尝试。
- 停止mongo, 运行mongodb,并进入mongodb
docker stop mongo docker start mongodb
docker exec -it mongodb mongo admin当你在这个容器内创建用户时,会发生错误,因为这个容器开启了权限认证,这就有一个bug:当容器运行起来后,你却需要通过认证才能操作数据库,但是,你都没办法创建用户。但是上面之所以要创建两个镜像,并且挂载一样的配置文件,就是为了解决这个问题,当在mongo镜像创建用户,这一信息被持久化了,故可以在mongodb镜像中使用该账户密码(root)直接对数据库进行操作。
db.auth("root","root")
exit
docker rm mongo在容器内,进入mongo 后,可用 db.auth() 命令进行验证,返回值为1表示通过认证。最后删除多余的mongo镜像资源。
- 配置远程连接(以mongodb4.4.0为例)
docker exec -it mongodb bash cd /etc apt update apt install nano nano mongod.conf.orig
进入容器后修改mongod.conf.orig文件中的 127.0.0.1 改成 0.0.0.0 即可。
- 另外在最新版中的mongodb创建用户时,需要指定加密方式
db.createUser({ user: "admin", pwd: "xxx", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ], mechanisms : ["SCRAM-SHA-1"] })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构