docker 部署 nodejs 服务-mongodb

Ubuntu 通过 apt-get 方式安装的 mongodb 版本比较老 2.6.10 ,干脆全部删除通过 docker 安装,轻量简洁也方便,踩坑过程如下。

宿主机版本

Ubuntu14.04

查看 mongo 相关镜像

docker search mongo
复制代码

pull 所需镜像

docker pull mongo
复制代码

启动镜像

  • 基本步骤
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name docker_mongodb -d mongo
# -p 映射端口,mongodb 默认端口为 27017,本机:容器
# -v 映射目录,本机目录:容器
# --name 为设置该容器的名称
# -d 设置容器以守护进程方式运行
复制代码
# 1. 本地创建文件夹
# mkdir /var/docker/mongo/data/
# 2. 映射数据库
# /var/docker/mongo/data:/data/db
docker run -p 27017:27017 -v /var/docker/mongo/data:/data/db --name docker_mongodb_1 -d mongo:latest
# 3. 查看docker启动情况
docker ps
# 4. 测试是否连接通畅(Robo 3T)(不论本地起的docker还是服务端起的docker都可以连接)
# address: IP 27017


# 也可以开启新的docker进程,如下
# docker run -p 3000:27017 -v /var/docker/mongo/data2:/data/db --name docker_mongodb_2 -d mongo:latest
复制代码
  • 添加 auth 访问数据库 默认端口顺便也一并改掉
# 删除之前的测试容器
# 起新的container(ecs开启27018端口,本机)
docker run -p 27018:27017 -v /var/docker/mongo/data:/data/db --name docker_mongodb -d mongo:latest --auth
# --auth:以认证的形式访问数据库

# 以bash命令进入container内
# docker exec -it <id> bash
# 查看mongo版本:mongo --version
# 进入mongo shell:mongo
# ....
# 退出 exit

# 直接以mongo命令进入container内
docker exec -it <id> mongo
show dbs
# 用户密码认证
use admin
# 创建超级管理员
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
# db.createUser({user:"admin",pwd:"123456",roles:["userAdminAnyDatabase",db:"admin"]})

复制代码
  • 创建普通用户
# 上面创建了超级用户
# 登入容器内
docker exec -it <id> bash
# 进入mongo shell
mongo
# 查看数据库
show dbs
# 切换admin
use admin
# auth认证
db.auth('root','root')
# 创建普通用户
db.createUser({user:"test-user",pwd:"123456",roles:[{ role: "readWrite", db: "test" }]})
# 操作test数据库
# 认证普通用户
db.auth('test-user','123456')
# 切换到test库
use test
# 插入测试数据
db.test.save({name:'laowang',age:18})

# robo3t远程访问


复制代码
  • docker 常用命令
docker rm <container_id>
docker stop <container_id>
docker start <container_id>
docker restart <container_id>
docker describe <container_id>
复制代码
  • docker 数据库导入
# 上面已经做了本机与docker数据库的映射 /var/docker/mongo/data:/data/db
# 所以本机 /var/docker/mongo/data 内在exec进入docker镜像后也可以正常访问
# 创建临时文件夹用于存放备份过来的数据库 /var/docker/mongo/data/db-dump
# exec进入docker镜像
# 执行数据库导入导出相关的操作(mongorestore --help / mongorestore --version)
mongorestore -h localhost:27017 -d car --dir ./db-dump/car -u wang -p 123456
复制代码

报错如下

Failed: can't create session: could not connect to server: connection() : auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-1": (AuthenticationFailed) Authentication failed.

注意添加: --authenticationDatabase=admin

# 完整导入如下
mongorestore -h localhost:27017 -d car --dir ./db-dump/car -u wang -p 123456
复制代码

exec 进入 docker 镜像后导出也是一样,事先做了映射,相应文件夹下的数据会共享

nodejs 连接数据库

由于设置了认证连接,且密码里有特殊字符( @ , % , : 等)

?authSource=admin

通过 admin 库进行登录认证,进而操作对应账户数据库

connect传入options

解决密码含有特殊字符

代码示例如下

// 连接方式不必拼接url,"mongodb://username:password@127.X.X.X:27017/db"
mongoose.connect(`mongodb://localhost:27017/car?authSource=admin`, {
  useCreateIndex: true,
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  user: 'wang',
  pass: 'Mima@120$'
})
复制代码
我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章