容器化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"})
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")
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() }
|
结果
程序输出:
MongoDB输出: