Ubuntu
經過apt-get
方式安裝的 mongodb 版本比較老2.6.10
,乾脆所有刪除經過 docker 安裝,輕量簡潔也方便,踩坑過程以下。html
Ubuntu14.04node
docker search mongo
複製代碼
# 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
複製代碼
--auth
訪問數據庫(docker-compose.yml
添加Auth方式點此查看)
爲了更安全點,默認端口也一併改掉redis
# 刪除以前的測試容器
# 起新的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遠程訪問
複製代碼
# container_id | name 都行
docker rm <container_id>
docker stop <container_id>
docker start <container_id>
docker restart <container_id>
docker describe <container_id>
複製代碼
# 上面已經作了本機與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=admin
docker
# 完整導入以下
mongorestore -h localhost:27017 -d car --dir ./db-dump/car -u wang -p 123456 --authenticationDatabase=admin
複製代碼
exec 進入 docker 鏡像後導出也是同樣,事先作了映射,相應文件夾下的數據會共享(也叫數據卷)shell
因爲設置了認證鏈接,!!!注意:且密碼裏有特殊字符(@
,%
,:
等),鏈接方式最好不要拼接地址數據庫
實踐方案以下: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