Docker容器之间的请求失败拨号tcp 172.18.0.6:3050:连接:连接被拒绝

我正在努力处理容器之间的 Go 请求。我的问题是我的其余容器可以向节点容器发送请求以提供响应,但是当我从 GoLang 应用程序向节点发送请求时,我收到拒绝错误“dial 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是否共享同一个网络,答案是肯定的。所有容器共享同一个网络

stack overflow Request between Docker containers failing dial tcp 172.18.0.6:3050: connect: connection refused
原文答案

答案:

作者头像

(与我的问题无关)对于任何有“拨号 tcp 连接被拒绝”问题的人,我建议通过该指南 https://maximorlov.com/4-reasons-why-your-docker-containers-cant-talk-to-each-other/ 。真的很有帮助。对于那些本指南无法帮助阅读以下内容的人,也许您在构建容器后尝试请求容器 api:D

对于那些对哪里出了问题感兴趣的人:从技术上讲,我收到此错误的原因是因为我试图运行的请求,只是在构建所有容器时。我相信构建容器后网络会有一些延迟。这就是为什么主机抛出“拨号 tcp 172.18.0.6:3050:连接:连接被拒绝”的原因我已经在其他可能向该节点容器发送请求的容器上运行了该测试,并且它们在构建时间之后都失败了。但是当几秒钟后重新请求时,一切都解决了。

抱歉打扰各位了。我真的花了 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

相关问题