docker 部署 nodejs 服务-mongodb

Ubuntu经过apt-get方式安装的 mongodb 版本比较老2.6.10,干脆所有删除经过 docker 安装,轻量简洁也方便,踩坑过程以下。html

宿主机版本

Ubuntu14.04node

查看 mongo 相关镜像

docker search mongo
复制代码

pull 所需镜像

# pull 本身所需镜像(如mongo,node这种官方镜像,也可本身封装镜像推到DockerHub)
docker pull mongo

# 查看已存在的镜像
docker images -a
复制代码

启动镜像

启动方式:
能够create/run,也能够docker-compose.yml构建mysql

  • 基本步骤
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 -a
# 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
复制代码
# 删除以前的测试容器
# 起新的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内(也可直接以mongo交互进入)
# 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:"123456",roles:[{role:'root',db:'admin'}]})
# db.createUser({user:"admin",pwd:"123456",roles:["userAdminAnyDatabase",db:"admin"]})

# auth验证
use admin
db.auth('root','123456')
复制代码
  • 建立普通用户
# 上面建立了超级用户
# 登入容器内
docker exec -it <id> bash
# 进入mongo shell
mongo
# 查看数据库
show dbs
# 切换admin
use admin
# auth认证
db.auth('root','123456')
# 建立普通用户
db.createUser({user:"wang",pwd:"123456",roles:[{ role: "readWrite", db: "car" }]})


# 认证普通用户
db.auth('wang','123456')
# 切换到car库
use car
# !!插入测试数据(!!!注意随便先插入一条,否则robo3t一直认证失败)
db.car.save({name:'奥拓',price:1988})

# robo3t远程访问

复制代码
  • docker 经常使用命令
# container_id | name 都行
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
复制代码

报错以下sql

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.mongodb

注意添加:--authenticationDatabase=admindocker

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

exec 进入 docker 镜像后导出也是同样,事先作了映射,相应文件夹下的数据会共享(也叫数据卷)shell

nodejs 链接数据库

因为设置了认证链接,!!!注意:且密码里有特殊字符(@,%,:等),链接方式最好不要拼接地址数据库

实践方案以下:ubuntu

?authSource=admin

指明经过 admin 库进行登陆认证,进而操做对应帐户数据库

connect传入options

解决密码含有特殊字符

代码示例以下

// 链接方式最好不要拼接url,"mongodb://username:password@127.X.X.X:27017/db"
mongoose.connect(`mongodb://110.120.119.114:27018/car?authSource=admin`, {
  useCreateIndex: true,
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  user: 'wang', // username
  pass: '123456@120$%' // password
})
复制代码

远程链接

工具

Robo 3T

步骤以下

注意阿里云 ECS 开启安全组27018

  • IP 和端口
  • Auth 认证
  • 链接测试

参考资料

相关文章
相关标签/搜索