使用Docker一键部署MongoDB
使用Docker一键部署MongoDB
Prerequisites
本文默认读者具备以下知识,不会对此进行展开:
-
Linux的基础使用 MongoDB的基础使用 mongo-express的基础使用 JavaScript的基础使用 Docker的安装与下载 Docker Compose的安装与下载
效果
通过一条指令sudo docker-compose up -d(-d表示在后台运行,如果想要监视Docker容器的运行情况,可不加)达到以下效果:
-
在本地一个Docker容器中建立并运行MongoDB,端口为27017 在本地一个Docker容器中建立并运行,端口为8080 初始化MongoDB: 创建一个新用户,并设置密码和权限 创建一个新的DB 创建一个新的Collection
如图,newDB就是我们新建的DB。
文件结构
├── docker-compose.yml
├── Dockerfile
└── setup
└── setup.js
解析
setup.js
用于初始化MongoDB。
db = db.getSiblingDB(newDB); // 创建一个名为"newDB"的DB
db.createUser( // 创建一个名为"shon"的用户,设置密码和权限
{
user: "shon",
pwd: "shonlovescoding",
roles: [
{ role: "dbOwner", db: "newDB"}
]
}
);
db.createCollection("newCollection"); // 在"newDB"中创建一个名为"newCollection"的Collection
docker-compose.yml
用于docker-compose,相较于纯粹的docker指令,减少了在命令行中的参数数量,而选择把对Docker容器的相关配置写在了本文件中
version: 3.1 # 与镜像有关,这里只支持3.1
services:
mongo: # 会自动从Docker Hub上自动获取mongo这个镜像
build: ./
restart: always
ports:
- 27017:27017 # 本地端口(可自定义):容器内默认端口(mongo设定为27017)
volumes:
- ./setup:/docker-entrypoint-initdb.d/ # 本地文件路径:容器内映射路径
environment: # admin账号和密码
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: DoNotPeek
# 如果不需要MongoDB的网页端,以下内容可以不加
mongo-express: # 会自动从Docker Hub上自动获取mongo-express这个镜像
image: mongo-express
restart: always
ports:
- 8080:8081 # 本地端口(可自定义):容器内默认端口(mongo-express设定为8080)
environment: # 这里只能使用与上方MONGO_INITDB_ROOT_USERNAME相同的root账号
ME_CONFIG_MONGODB_ADMINUSERNAME: admin
ME_CONFIG_MONGODB_ADMINPASSWORD: DoNotPeek
Dockerfile
用于初始化Docker容器
FROM mongo # 将本地的setup.js映射到Docker容器中 COPY ./setup/setup.js /docker-entrypoint-initdb.d/
验证
通过mongodb-org-shell来连接(安装请见):
$ mongo -u shon -p shonlovescoding --host localhost --authenticationDatabase newDB MongoDB shell version: 3.2.20 connecting to: localhost:27017/test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user > show dbs newDB 0.000GB > use newDB switched to db newDB > show collections newCollection
注意,mongo官方的Docker镜像默认是开启登陆认证的,因此--authenticationDatabase不可少。
问题
这套”只用Docker一键部署MongoDB“的机制在很大程度上方便了开发者部署Mongo环境,但因开发匆忙,目前的版本也存在了一些问题,在之后的版本中,本文可能会尝试改进配置来解决这些问题:
-
mongo-express目前只能使用root账户登陆,这非常危险 数据文件的存储应用volume映射到本地位置,而不应和Docker容器同生共死,即使设置了restart:always 使用本地存储也方便了数据备份
代码
更新日志
-
2018-11-12: V1.0.2 Dockerfile 并非可选,而是必需 2018-08-20:V1.0.1 对docker-compose.yml中的mongo-express进行注释 更新GitHub地址 2018-08-16: V1.0.0 初始版本
