我正在努力处理容器之间的 Go 请求。 我遇到的问题是,我的其余容器可以向给出响应的节点容器发送请求,但是当我从 GoLang 应用程序向节点发送请求时,我收到拒绝错误“拨号 tcp 172.18.0.6:3050: connect: connection拒绝”。 所以我的整个码头设置是:
version: "3.3"
services:
##########################
### SETUP SERVER CONTAINER
##########################
node:
# Tell docker what file to build the server from
image: myUserName/mernjs:node-dev
build:
context: ./nodeMyApp
dockerfile: Dockerfile.dev
# The ports to expose
expose:
- 3050
# Port mapping
ports:
- 3050:3050
# Volumes to mount
volumes:
- ./nodeMyApp/src:/app/server/src
# Run command
# Nodemon for hot reloading (-L flag required for polling in Docker)
command: nodemon -L src/app.js
# Connect to other containers
links:
- mongo
# Restart action
restart: always
react:
ports:
- 8000:8000
build:
context: ../reactMyApp
dockerfile: Dockerfile.dev
volumes:
- ../reactMyApp:/usr/src/app
- /usr/src/app/node_modules
- /usr/src/app/.next
restart: always
environment:
- NODE_ENV=development
golang:
build:
context: ../goMyApp
environment:
- MONGO_URI=mongodb://mongo:27017
# Volumes to mount
volumes:
- ../goMyApp:/app/server
links:
- mongo
- node
restart: always
因此,我的 React 应用程序可以将请求发送到“http://node:3050/api/greeting/name”,即使 React 应用程序未链接到
node
应用程序,但当 Golang 应用程序将请求发送到时,它也会得到响应节点 docker 容器收到连接拒绝消息 GetJson err: Get "http://node:3050/api/greeting/name": dial tcp 172.18.0.6:3050: connect: connection refused
func GetJson(url string, target interface{}) error {
r, err := myClient.Get(url)
if err != nil {
fmt.Println("GetJson err: ", err)
return err
}
defer r.Body.Close()
return json.NewDecoder(r.Body).Decode(target)
}
type ResultsDetails struct {
Greeting string `bson:"greatingMessage" json:"greatingMessage"`
Message string `bson:"message" json:"message"`
}
func GetGreetingDetails(name string) ResultsDetails {
var resp ResultsDetails
GetJson("http://node:3050/api/greeting/"+name, &resp)
return resp
}
那么当 docker 没有将主机视为我的容器“节点”的名称时,如何解决对另一个 Docker 节点容器的 Golang 请求?
更新: 偶然我放置了 Golang 端口,它不会在任何端口上运行,因为它是检查数据库记录的应用程序。所以它没有任何 api,因此它没有在任何端口上运行。 这可能是我的 golang 应用程序无法与其他容器通信的问题吗?
因为我还有另一个 golang 应用程序,它是 api 应用程序,它在 5000 端口上运行,并且与我的节点应用程序通信良好?
网络信息: 检查网络后,node 和 golang 是否共享同一网络,答案是肯定的。所有容器共享同一网络
(与我的问题无关)对于任何有“拨号 tcp 连接被拒绝”问题的人,我建议阅读该指南 https://maximorlov.com/4-reasons-why-your-docker-containers-cant-talk-彼此/。真的很有帮助。对于那些本指南无法帮助您阅读以下内容的人,也许您在构建容器后尝试请求容器 api :D
对于那些对问题所在感兴趣的人: 从技术上讲,我收到此错误的原因是因为我尝试运行的请求恰好是在构建所有容器时。 我相信容器构建后网络会有一些延迟。这就是为什么主机抛出“拨号 tcp 172.18.0.6:3050: connect: 连接被拒绝”的原因我已经在可能向该节点容器发送请求的其他容器上运行了该测试,并且它们在构建时间后都失败了。但几秒钟后重新请求时一切都解决了。
抱歉打扰你们了。我真的花了3天时间来解决这个问题。我正在寻找完全错误的方向。没想到这个问题这么傻:D
谢谢您的时间。
我在我的港口注册服务中遇到了同样的错误。 当我 docker exec -it 进入容器后,检查服务是否可用,最后发现 http_proxy 已被设置。
删除 docker 服务的 http_proxy 设置,然后它就可以正常工作了。
加载休息配置错误失败:获取“http://core:8080/api/internal/configurations”:拨打 tcp 172.22.0.8:8080:连接:连接被拒绝
$docker exec -it harbor-jobservice /bin/bash
$echo $http_proxy $https_proxy