【发布时间】:2022-01-26 07:09:22
【问题描述】:
我正在努力处理容器之间的 Go 请求。 我的问题是我的其余容器可以向节点容器发送请求以提供响应,但是当我从 GoLang 应用程序向节点发送请求时,我收到拒绝错误“dial tcp 172.18.0.6:3050: connect: connection拒绝”。 所以我的整个 docker 设置是:
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共享同一个网络,答案是肯定的。所有容器共享同一个网络
【问题讨论】:
-
您的问题包含相互矛盾的信息。您声称该消息说它无法连接到
172.18.0.5:3050,而您实际引用的消息是关于172.18.0.7:4000,即不同的 IP 和不同的端口 - 特别是一个不可访问的端口。 -
@GeorgeShevchenko:IP 地址还是不一样。此外,复制+粘贴不会神奇地发生错误。这更多地表明您将多次尝试的东西混合在一起,这让我想知道您所问的是否真的按照您描述的方式发生。
-
查看我最初的回复。阅读该链接并单独重现问题。删除所有不必要的东西。
-
我会这样说:它应该可以工作,我认为您发布的内容没有任何问题。确保您的所有断言同时为真,并且状态不会意外成。
-
@GeorgeShevchenko:您的客户端应用程序不需要暴露给任何端口。暴露端口是针对监听器的,即接受连接的服务器。而是由客户端发起连接。
标签: docker go containers communication connection-refused