使用Docker一键部署MongoDB
作者:Shon
版本:1.0.2
最后更新:2018-11-12
Prerequisites
本文默认读者具备以下知识,不会对此进行展开:
- Linux的基础使用
- MongoDB的基础使用
- mongo-express的基础使用
- JavaScript的基础使用
- Docker的安装与下载
- Docker Compose的安装与下载
效果
通过一条指令sudo docker-compose up -d
(-d
表示在后台运行,如果想要监视Docker容器的运行情况,可不加)达到以下效果:
- 在本地一个Docker容器中建立并运行MongoDB,端口为27017
- 在本地一个Docker容器中建立并运行mongo-express,端口为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 初始版本