使用 Docker Compose 安装 MongoDB
最近学习 Docker
,试着在 Docker
里安装 MongoDB
,按照镜像 mongo 文档一顿操作猛如虎。
快速开始
写个 docker-compose.yml
文件:
version: '3.8'
services:
db:
image: mongo
container_name: mongodb-container
ports:
- '27017:27017'
command: [--auth]
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
volumes:
- ./.docker/mongo_data:/data/db
复制代码
启动容器:
docker-compose up
复制代码
搞定,坐等连接 MongoDB
,出现报错 Authentication failed.
,说我验证失败,用过 MongoDB
的都知道这玩意需要创建账号验证。
Authentication
mongo
文档上面写的有 Authentication
标题,我们翻译一下:
MongoDB
中的身份验证相当复杂(尽管默认禁用)。关于MongoDB
如何处理身份验证的详细信息,请参见相关的[MongoDB文档]:
- mongod --auth
- Security > Authentication
- Security > Role-Based Access Control
- Security > Role-Based Access Control > Built-In Roles
- Security > Enable Auth (tutorial)
除了上面文档的 /docker-entrypoint-initdb.d
行为外(这是配置用户的简单方法是否可用于较少复杂的部署),此镜像也支持 Mongo_initdb_root_Username
和 Mongo_initdb_root_Password
,用于创建具有角色根的简单用户管理员身份验证数据库,如上面的环境变量部分所述。
默认只帮我们创建了一个超级管理员账号,还不带验证的那种。
只能求助万能网友,在 stackoverflow 搜索一圈,给我一个明灯:mongo-auth,按照它的配置一顿操作,再运行 docker-compose up
,本以为没有问题:
services.mongo.environment contains {"AUTH": "yes"}, which is an invalid type, it should be a string
复制代码
算了,只能换一届网友,然后阅读各种博客文章,结论:打开 cli
客户端,在 mongo
里手动创建一个账号并验证即可。
使用 CLI 认证用户
-
pull and run docker containers
docker-compose up -d 复制代码
-
open mongo cli
docker exec -it mongodb-container mongo admin 复制代码
-
create user administrator:
db.createUser({ user: 'root', pwd: 'root', roles: [ { role: "root", db: "admin" } ] }) 复制代码
exit mongo cli
-
认证管理员
open mongo cli
docker exec -it mongodb-container mongo admin 复制代码
auth root amdin
db.auth('root', 'root') 复制代码
-
创建数据库
use test 复制代码
-
创建数据库用户
db.createUser({ user: 'test', pwd: 'test', roles: [ { role: "readWrite", db: "test" } ] }) 复制代码
注意: 如果你机器已经安装
Mongodb
客户端,并且已经启动,先关闭了,如果是Windows
,并且使用过服务启动Mongodb
,把它关闭了。
使用脚本自动认证用户
作为一个程序员,能程序搞定的就不要动手捣鼓。我们换个姿势再来一次:
关闭容器并删除
docker-compose down
复制代码
删除本地数据映射目录
rm -fr .docker
复制代码
重写配置文件并增加几个环境变量:
version: '3.8'
services:
db:
image: mongo
container_name: mongodb-container
ports:
- '27017:27017'
command: [--auth]
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
MONGO_INITDB_DATABASE: cnode
MONGO_USERNAME: cnode
MONGO_PASSWORD: cnode
volumes:
- ./.docker/mongo_data:/data/db
- ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh
复制代码
真实项目环境变量需要使用
.env
文件去书写,使用替换方式
增加初始化脚本 mongo-init.sh
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
db = db.getSiblingDB('admin')
db.auth('$MONGO_INITDB_ROOT_USERNAME', '$MONGO_INITDB_ROOT_PASSWORD')
db = db.getSiblingDB('$MONGO_INITDB_DATABASE')
db.createUser({
user: "$MONGO_USERNAME",
pwd: "$MONGO_PASSWORD",
roles: [
{ role: 'readWrite', db: '$MONGO_INITDB_DATABASE' }
]
})
EOF
复制代码
脚本很简单,就是把上面手动操作的,一波自动完成。
docker-compose up -d
复制代码
打开程序连接试试: