无法从本地运行的 Golang 连接到正在运行的 Docker 容器

问题描述 投票:0回答:1

我有一个在本地运行的容器

docker run \
    --publish 8081:8081 \
    --publish 10250-10255:10250-10255 \
    --interactive \
    --tty \
    mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest   

我可以在 Chrome 中正常运行,https://localhost:8081/etc/etc。

但是我现在必须编写一个 Go 程序来对正在运行的容器进行 API 调用。我得到:

Post "https://172.17.0.2:8081/dbs": dial tcp 172.17.0.2:8081: connect: no route to host

我在这里遗漏了什么吗?我需要进一步公开端口吗?

package main

import (
    "context"
    "log"
    "github.com/Azure/azure-sdk-for-go/sdk/data/azcosmos"
)

func main() {
    const (
        cosmosDbEndpoint = "https://localhost:8081/"
        cosmosDbKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw=="
        dbname = "db5"
    )
    cred, err := azcosmos.NewKeyCredential(cosmosDbKey)
    handle(err)
    client, err := azcosmos.NewClientWithKey(cosmosDbEndpoint, cred, nil)
    handle(err)
    databaseProperties := azcosmos.DatabaseProperties{ID: dbname}
    _, err = client.CreateDatabase(context.Background(), databaseProperties, nil)
    handle(err)
}

尝试跑步

set http_proxy=
set https_proxy=

请注意,您必须导入证书,如下所示 卷曲 -k https://localhost:8081/_explorer/emulator.pem > ~/emulatorcert.crt 然后例如在 Mac 中转到钥匙串,添加证书并信任它

docker go networking localhost port
1个回答
0
投票

如果您从与模拟器位于同一网络上的 Docker 容器运行代码(并使用适当的地址),则您的代码将可以工作。要从主机访问它,您需要使用

AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE
覆盖模拟器 IP 地址,即

docker run -e AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=127.0.0.1 --publish 8081:8081 --publish 10250-10255:10250-10255 --interactive --tty mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest

如果没有此设置,模拟器将告诉客户端连接到其 docker 分配的 IP(无法从主机访问)。

© www.soinside.com 2019 - 2024. All rights reserved.