【问题标题】:Request between Docker containers failing dial tcp 172.18.0.6:3050: connect: connection refusedDocker容器之间的请求失败拨号tcp 172.18.0.6:3050:连接:连接被拒绝
【发布时间】: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


【解决方案1】:

(与我的问题无关)对于遇到“拨号 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

感谢您的宝贵时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 2020-01-01
    • 2022-07-21
    • 2018-09-29
    • 2019-10-20
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多