gpt4 book ai didi

mongodb - 使用docker时Go无法连接到Mongo容器

转载 作者:行者123 更新时间:2023-12-03 10:09:10 25 4
gpt4 key购买 nike

我想运行3个服务:

  • 我的Go程序,它将在另一个容器中连接到MongoDB
  • 蒙戈
  • Mongo Express

  • 这是我的docker-compose.yml:
    version: "3.7"

    services:
    app:
    image: test-go-docker
    environment:
    - MONGO_HST=mongo
    - MONGO_PRT=27018

    mongo:
    image: mongo
    ports:
    - 27018:27017
    volumes:
    - /data/db

    mongo-express:
    image: mongo-express
    ports:
    - 8081:8081
    如您所见,我的Mongo数据库已映射到端口217018,网络名称为mongo。
    我的Golang程序将通过环境变量(MONGO_HST和MONGO_PRT)获取主机名和端口。这是我的Go程序:
    package main

    import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "net/http"
    "os"
    "time"
    )

    type MyData struct {
    Name string
    Text string
    }

    func viewHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello world!")
    }

    func main() {
    mongoURI := "mongodb://" + os.Getenv("MONGO_HST") + ":" + os.Getenv("MONGO_PRT") + "/"
    client, err := mongo.NewClient(options.Client().ApplyURI(mongoURI))
    must(err)

    ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
    defer cancel()

    err = client.Connect(ctx)

    collection := client.Database("test_db").Collection("test_collection")
    data := MyData{
    Name: "testing...",
    Text: "Hello world",
    }

    _, err =collection.InsertOne(context.Background(), data)
    must(err)

    // Serve the page
    http.HandleFunc("/", viewHandler)
    err = http.ListenAndServe(":8000", nil)
    must(err)
    }

    func must(err error) {
    if err != nil {
    fmt.Println("Some error...")
    panic(err)
    }
    }
    运行docker-compose后,检查Go容器的日志将显示以下消息:
    Some error...
    panic: server selection error: server selection timeout, current topology: { Type: Unknown, Servers: [{ Addr: mongo:27018, Type: Unknown, State: Connected, Average RTT: 0, Last error: connection() : dial tcp 172.25.0.4:27018: connect: connection refused }, ] }

    goroutine 1 [running]:
    main.must(0xccfce0, 0xc0002dd000)
    /go/src/my_app/cmd/main.go:50 +0xae
    main.main()
    /go/src/my_app/cmd/main.go:39 +0x35d
    从日志中,我可以看到Go试图连接到以下地址:mongo:27018,实际上这是我想要看到的。
    运行 docker ps,我还可以看到我的2个容器mongo,mongo-express正在运行:
    29533908c7fc   mongo           "docker-entrypoint.s…"   50 minutes ago   Up 50 minutes   0.0.0.0:27018->27017/tcp   go-with-docker_mongo_1
    f4789b54ddbd mongo-express "tini -- /docker-ent…" 50 minutes ago Up 50 minutes 0.0.0.0:8081->8081/tcp go-with-docker_mongo-express_1
    有任何想法吗?非常感谢!

    最佳答案

    容器之间的连接将忽略ports:。将标准端口用于目标容器,在这种情况下,请使用标准MongoDB端口27017。

    services:
    app:
    environment:
    - MONGO_PRT=27017 # the standard port

    mongo:
    image: mongo
    # ports: # not used for connections between containers
    # - 27018:27017 # only from outside Docker
    Docker文档中的 Networking in Compose说了更多。

    关于mongodb - 使用docker时Go无法连接到Mongo容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65855598/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com