Docker-Compose API 调用和端点容器化
Posted
技术标签:
【中文标题】Docker-Compose API 调用和端点容器化【英文标题】:Docker-Compose API Call and Endpoint Containerized 【发布时间】:2019-07-06 14:25:30 【问题描述】:使用 docker-compose,我运行了多个容器 - 其中一个是调用 API 的分析器容器,另一个容器 apiconnection 应该接收调用并发送回信息。但是,当我运行撰写文件时,它总是在 Profiler 容器的 http.DefaultClient.Do
行返回 Get http://apiconnection:8080/maccaption: dial tcp: lookup apiconnection on 127.0.0.11:53: no such host
。
这是我的撰写文件的示例:
apiConnection:
image: apiconnection:1.0
ports:
- "8080:8080"
networks:
- maccaptionNet
profiler:
image: profiler:1.0
networks:
- maccaptionNet
depends_on:
- "apiConnection"
我在我的分析器图像中调用 api,就像这样 - 它在 DefaultClient
上出错:
url := "http://apiconnection:8080/maccaption"
req, err := http.NewRequest("GET", url, nil)
if err != nil
log.Fatal(err)
res, err := http.DefaultClient.Do(req)
if err != nil
fmt.Println("Line 27")
log.Fatal(err)
body, err := ioutil.ReadAll(res.Body)
if err != nil
fmt.Println("Line 33")
log.Fatal(err)
如果我将url := "http://apiconnection:8080/maccaption"
修改为像url := "http://localhost:8080/maccaption"
这样查看localhost,它会更改为connect refused
,但我认为我不应该查看localhost,我需要查看Docker 容器不要一世?
我将 url 设置为与 docker 容器的连接,并使用我在 docker-compose 文件中分配的端口。 并在我的 apiconnection 图像中接收请求,如下所示:
r := mux.NewRouter()
r.HandleFunc("/maccaption", handleMaccaption).Methods("GET")
http.ListenAndServe(":8080", r)
它现在应该做的就是启动并发出一个请求以证明它正在工作并返回一些 json 信息。此代码在 docker 之外工作,将 url 变量中的容器名称替换为 localhost。但我无法让它在 docker 中运行。
我查看了这些其他资源以寻求帮助,但无济于事: how to call api endpoint inside docker container? Making a REST Call to Endpoint in Dockers Docker-compose internal communication using endpoints
任何指点将不胜感激 - 谢谢!
**EDIT - 修复我不可靠的代码格式
【问题讨论】:
“我忽略了错误返回,然后我的程序恐慌”显然不是惯用的 Go。您需要捕获错误返回。错误消息可能会包含一些有用的信息。 感谢@DavidMaze 的来电——非常感谢!!它通过一条新的错误消息让我走上了正确的轨道。我已经用实际问题修改了原始问题。 【参考方案1】:对于将来尝试做类似事情的任何人:上面的代码实际上确实工作。但是我出错的地方是,在我的url := "http://apiconnection:8080/maccaption"
中,我指的是图像名称,而不是我在 docker-compose.yml 中定义的服务名称。
更改 url 以查看服务名称而不是图像名称更正了问题,我现在可以在我的 dockerized 环境中进行 API 调用。
【讨论】:
以上是关于Docker-Compose API 调用和端点容器化的主要内容,如果未能解决你的问题,请参考以下文章
Docker 中的 Kong : 在不使用 curl 的情况下配置 API 端点
如何在 laravel http 客户端 api 调用中分离基本 URL 和端点?
使用 REST 客户端 POSTMAN 使用 api 密钥调用 AWS api 网关端点