容器化Mongo

容器化MongoDB—踩坑总结

拉取并实例化MongoDB

1
2
3
4
5
6
7
8
// 拉取MongoDB镜像
docker pull mongo:latest

// 查看本地镜像目录
docker images

// 实例化MongoDB容器
docker run -p 27017:27017 -v $PWD/db:/data/db --name mongo -d mongo

-p 27017:27017映射端口号。本地端口 : 容器端口

-v $PWD/db:/data/db 将容器目录挂载到本地,保存容器内数据库数据。$PWD / (本地相对路径) :(容器内路径)

--name mongo 容器命名。

-d 后台启动容器

进入MongoDB命令行

MongoDB 6.0 及以上版本使用以下命令:

1
docker exec -it mongo mongosh

其余版本使用以下命令:

1
docker exec -it mongo mongo

创建用户并赋予权限

1
2
3
4
5
6
7
8
9
// 切换至admin数据库
use admin

// 创建角色
db.createUser({user:"root", pwd:"password", roles:[
{role:"userAdminAnyDatabase",db:"admin"},
{role:"readWrite",db:"admin"}
]
});

重启mongo并加上权限参数

1
docker start mongo --auth

Go测试连接程序

获取包

1
go get go.mongodb.org/mongo-driver/mongo

通过本地Go程序连接docker容器内的MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package main

import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"log"
)

var client *mongo.Client

// 初始化数据库连接
func initMongo() {
URI := "mongodb://127.0.0.1:27017"

// 设置客户端连接配置
clientOptions := options.Client().ApplyURI(URI).SetAuth(options.Credential{Username: "root", Password: "password"})

// 连接到MongoDB
client, _ = mongo.Connect(context.TODO(), clientOptions)

// 检查连接
err := client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal(err)
}
fmt.Println("Connected to MongoDB!")
}

// 实体类定义
type Person struct {
Name string
Age int
}

封装 插入和查找 数据库操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 插入单条数据
func insert() {
col := client.Database("admin").Collection("word")

ret, err := col.InsertOne(context.TODO(), &Person{Name: "李兰迪", Age: 23})
if err != nil {
log.Fatalln(err)
}
fmt.Println("Insert:", ret.InsertedID)
}

// 查找多条条数据
func Find() {
fmt.Println("Find:")
opt := options.Find()
opt.SetLimit(5)

col := client.Database("admin").Collection("word")

// 查询 Name 值为 李兰迪 的数据
// Find查询多条记录,将会返回一个迭代器,使用完记得关闭
cor, err := col.Find(context.TODO(), bson.D{{"name", "李兰迪"}}, opt)
if err != nil {
log.Fatalln(err)
}
defer cor.Close(context.TODO())

for cor.Next(context.TODO()) {
var p Person
_ = cor.Decode(&p)
fmt.Println(p)
}
}

执行程序

1
2
3
4
5
func main() {
initMongo()
insert()
Find()
}

结果

程序输出:

image-20230205160033939

MongoDB输出:

image-20230205160157975