私は、MongoDBとDockerを使用して、Goの非常に基本的な(私は思った)スタータープログラムに取り組んでいます。仕事で使い始める前に、これらを理解しようとしています。公式のDockerイメージを使用して、ローカルホストを使用するだけで、MongoDBをDockerコンテナーで実行できます。これは正常に動作しています。MongoDBCompassを介して接続し、DBを変更できます。
次のタスクは、DBの読み取りと書き込みができる別のDockerコンテナーを構築することでした。 mgoはもう稼働していないため、MongoDB-Go-Driver( https://godoc.org/github.com/mongodb/mongo-go-driver/mongo )を使用しています。
これは私のコードです。単純な接続を作成するためにオンラインで多数のチュートリアルを実行し、接続を確認するためにDBにpingを送信しています。
client, err := mongo.Connect("mongodb://localhost:27017")
if err != nil {
log.Fatal("error ", err)
}
// Check the connection
err = client.Ping(context.TODO(), nil)
if err != nil {
log.Fatal("error2 ", err)
}
fmt.Println("Connected to MongoDB!")
error2 server selection timeout
を使用して、DBでの操作(Find、FindOne、Pingなど)を実行すると常に失敗します。
これは私が実行している私のdocker-composeファイルです。
version: "3"
services:
datastore:
image: mongo
ports:
- "27017:27017"
networks:
- maccaptionNet
volumes:
- .:/go/src/maccaption_microservice/dbdata
jobservice:
image: jobservicemaccaption:1.0
networks:
- maccaptionNet
depends_on:
- "datastore"
networks:
maccaptionNet:
driver: bridge
私はMongoDBを初めて使用しましたが、何時間もの調査を行った結果、これについては何の進展もありませんでした。私は https://docs.mongodb.com/manual/core/read-preference-mechanics/https://docs.mongodb.com/manual/replication/
誰かがこれを正しい方向に向けることができますか?私はこの特定の問題について多くを見つけることができませんでした。
ありがとう!
別のドッカーに接続している場合(docker-compose
ファイル、およびbridge
ネットワークモードを使用して、localhost
をdatastore
のようなホスト名に変更する必要があります
client, err := mongo.Connect("mongodb://datastore:27017")
go
スクリプトがlocalhost
を使用する場合、データベースが同じDockerにあると想定します
どういうわけか私はこの問題を別の方法で修正しました:ports
を"27018:27017"
から"27017:27017"
に変更します。 IDKがこれを支援する理由。たぶん、Mongoがデフォルトのポートを認識しない場合、Mongoのノードのクラスターがあると考えられます。
私の回答は無関係かもしれないと思いますが、それでも同じエラーが発生しました。それは、私のIPアドレスがMongoDBアトラスの[IPホワイトリスト]タブにリストされていなかったためです。接続を試みる前に、IPアドレスがあることを確認してください。
私は同じ問題を抱えていましたが、この問題に対処する別の方法を見つけました。 Dockerイメージの実行中にネットワークパラメータを渡すだけで、Dockerは正しいローカルホストを指すようになります。
docker run --network="Host" ....