1 回答

TA貢獻1817條經驗 獲得超6個贊
這里有幾個問題。
首先和MONGODB_INITDB_ROOT_USERNAME都是MONGODB_INITDB_ROOT_PASSWORD錯誤的。他們應該是MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_USERNAME。
問題是mongo1啟動后不久就會崩潰,因為它需要一個secret.key. 檢查日志,您將看到錯誤。解決這個問題是另一個問題。
我建議先嘗試不進行身份驗證。這是有效的方法:
您缺少的步驟:
echo 127.0.0.1 mongo1 >> /etc/hosts
數據庫啟動腳本:
#!/bin/bash
docker container rm -f mongo1 mongo2 mongo3
docker run -d -p 27017:27017 --name mongo1 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker run -d -p 27018:27017 --name mongo2 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker run -d -p 27019:27017 --name mongo3 --network mongoCluster mongo:latest mongod --replSet myReplicaSet --bind_ip_all
docker exec -it mongo1 mongosh --eval "rs.initiate({
_id: \"myReplicaSet\",
members: [
{_id: 0, host: \"mongo1\"},
{_id: 1, host: \"mongo2\"},
{_id: 2, host: \"mongo3\"}
]
})"
go中的測試程序:
package main
import (
"context"
"fmt"
"time"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
"go.mongodb.org/mongo-driver/mongo/readpref"
)
const uri = "mongodb://mongo1:27017/task?replicaSet=myReplicaSet&retryWrites=true&w=majority"
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
if err != nil {
panic(err)
}
defer func() {
if err = client.Disconnect(ctx); err != nil {
panic(err)
}
}()
if err := client.Ping(ctx, readpref.Primary()); err != nil {
panic(err)
}
fmt.Println("Successfully connected and pinged")
}
運行這個,你應該得到一個成功的響應:
> go run ./main.go
Successfully connected and pinged
另外我認為您不需要映射主機上的所有副本端口。這應該使事情更清潔。
- 1 回答
- 0 關注
- 114 瀏覽