MongoDB 是一个基于分布式文件存储的数据库。介于关系数据库和非关系数据库之间。
MongoDB 官方 image 仓库地址:https://hub.docker.com/_/mongo
image 标签和各自的 Dockerfile 链接:
docs/README.md at master · docker-library/docs (github.com)
安装 MongoDB
本文环境:
- Linux 发行版:Ubuntu Focal 20.04 (LTS)
- Docker version 20.10.11
- docker-compose version 1.29.2
拉取镜像:
# mongo:4.4.11-focal,基础镜像是 ubuntu:focal
docker pull mongo:4.4.11-focal
创建数据挂载目录:
# 创建数据库存放目录,可替换为你自己的路径
mkdir mongo_test
cd mongo_test
mkdir data # 用于挂载数据文件
mkdir backup # 用于挂载备份文件
启动容器(与后面的容器编排方式二选一即可,推荐用容器编排方式启动):
docker run --name mongo4411 \
-p 27017:27017 \
-v ${PWD}/data:/data/db \
-v ${PWD}/backup:/data/backup \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
-d mongo:4.4.11-focal --auth
--name
,容器的名称,自定义。-p
,映射容器端口到宿主机端口。-v
,挂载宿主机目录到容器内,如宿主机目录不存在则创建。/data/db
是数据库文件存放的地方。必须要挂载到容器外,否则容器重启一切数据消失。/etc/localtime
,让容器的时钟与宿主机同步,避免时区的问题,ro
是 read only 的意思,默认是rw
读写模式。
-d
,容器以守护进程方式运行。--auth
,需要密码才能访问数据库。(mongodb 默认无须身份验证)
查看容器状态:
docker ps -a
退出并删除容器:
docker stop mongo4411
docker rm mongo4411
容器编排
Mongo-Express
基于 web 的 MongoDB 管理界面,用 Node.js、 Express 和 bootstrap3 编写。
官方 image 仓库地址:https://hub.docker.com/_/mongo-express/
拉取镜像:
# mongo-express:0.54.0 基础镜像是 node:12-alpine3.11
docker pull mongo-express:0.54.0
docker-compose
创建容器环境变量文件
mongo.env
# mongo的root用户和密码
MONGO_INITDB_ROOT_USERNAME="root"
MONGO_INITDB_ROOT_PASSWORD="123456"
以上文件也可以什么都不写,留到后面启动数据库后再创建 root 用户。
express.env
# 登录 Mongo-Express 的用户名和密码,如无需验证可不设置
ME_CONFIG_BASICAUTH_USERNAME="admin"
ME_CONFIG_BASICAUTH_PASSWORD="123456"
# 登录 Mongo 的用户名和密码
ME_CONFIG_MONGODB_ADMINUSERNAME="root"
ME_CONFIG_MONGODB_ADMINPASSWORD="123456"
创建 docker-compose.yml
version: "3.1"
services:
mongo:
image: mongo:4.4.11-focal
container_name: mongo4411
restart: always
volumes:
- "${PWD}/data:/data/db"
- "${PWD}/backup:/data/backup"
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
ports:
- "27017:27017"
env_file:
- mongo.env
command: mongod --auth
mongo-express:
image: mongo-express:0.54.0
restart: always
container_name: mongo-express
volumes:
- "/etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
ports:
- 8081:8081
env_file:
- express.env
env_file
:指定要加载的环境变量文件,即上面的 .env 文件。
检查模板文件:
docker-compose config
可以看到,.env
文件中的值会自动添加到 environment
对应的项下,如果有报错或者警告,根据提示修改。
启动容器:
docker-compose up -d
-d
:后台启动。
查看状态:
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
mongo4411 docker-entrypoint.sh mongod Up 0.0.0.0:27017->27017/tcp
mongo_mongo-express_1 tini -- /docker-entrypoint ... Up 0.0.0.0:8081->8081/tcp
访问 Mongo-Express 管理页面 http://主机IP地址:8081
,使用前面 .env 文件设置的 Mongo-Express 用户名和密码进行登录。
关闭容器可使用: docker-compose down
测试
进入容器,连接数据库:
# 登录并切换db到admin
$ docker exec -it mongo4411 mongo admin
# 登录root用户,如果前面没有创建root用户可跳过此步
> db.auth('root','123456')
# 创建所有数据库管理用户 admin/123456
> db.createUser({user:'admin',pwd: '123456',roles:[{role:"userAdminAnyDatabase", db:"admin"}, "readWriteAnyDatabase"]});
# Successfully added user: { ...
# 使用新用户登录,返回 0=失败 1=成功
> db.auth('admin', '123456')
# 1
# 创建测试库
> use testdb
# 插入测试数据
> db.testdb.insert({"name":"testdb"})
# 创建用户并授权,dbOwner代表数据库所有者角色,拥有最高该数据库最高权限。
> db.createUser({ user:"user_testdb", pwd:"123456", roles: [{ role:"dbOwner", db:"testdb" }] })
>
# 退出数据库
> exit
CTRL+D
退出容器。
备份数据库
容器外执行备份
$ docker exec mongo4411 sh -c 'var=`date +%Y%m%d%H%M` && mongodump -h localhost --port 27017 -u "admin" -p "123456" -d "testdb" --authenticationDatabase 'admin' -o /data/backup/testdb_${var}'
# 备份 `admin` 数据库到宿主机的 backup/testdb_yyyymmddhhmm/testdb
-h
:数据库地址-d
:需要备份的数据库实例-o
:备份路径--authenticationDatabase
:需要身份认证
容器外执行恢复
$ docker exec mongo4411 sh -c 'mongorestore -h localhost:27017 -u "admin" -p "123456" -d "testdb" --authenticationDatabase 'admin' /data/backup/testdb_202203022229/testdb'
– END –