【问题标题】:Failed to open TCP connection to localhost:3101 - Rails / Docker无法打开到 localhost:3101 的 TCP 连接 - Rails / Docker
【发布时间】:2021-05-22 10:00:08
【问题描述】:

我正在尝试从我们的应用 ping 我们的 Rails 微服务之一(处理电子邮件),但我收到标题错误。

我们的微服务在 localhost:3101 上的 docker 中运行,而我们的应用程序也在 docker 上的 localhost:3000 上 - 我已经用邮递员请求对其进行了 ping 操作,它工作正常。

我在 ENV 变量中设置了我们的身份验证令牌和电子邮件服务 API,如下所示:-

EMAIL_SERVICE=http://localhost:3101
EMAIL_SERVICE_TOKEN=1234

这是我的EmailService:-

class EmailService
  require 'net/http'

  HEADER = { 'Content-Type': 'application/json' }.freeze
  ENDPOINTS = {
    root: ENV['EMAIL_SERVICE'],
    test_email: {
      post: {
        url: '/api/test_email'
      }
    }
  }

  def initialize
    @token = ENV['EMAIL_SERVICE_TOKEN']
  end

  def call_api(section, action, data, method='POST')
    address_url = ENDPOINTS[section][action][:url]
    uri = URI.parse("#{ENDPOINTS[:root]}#{address_url}")

    # Create the HTTP objects
    http = Net::HTTP.new(uri.host, uri.port)
    if method == 'POST'
      request = Net::HTTP::Post.new(
        uri.request_uri,
        HEADER
      )
      request.body = data.merge({ auth_token: @token }).to_json

    else
      request = Net::HTTP::Get.new(
        uri.request_uri,
        HEADER
      )
    end

    http.use_ssl = true
    response = http.request(request)
  end
end

知道我错过了什么吗?

【问题讨论】:

    标签: ruby-on-rails ruby docker microservices net-http


    【解决方案1】:

    我假设这两个微服务都运行在不同的 docker 容器上。

    我认为问题在于,当 docker 从容器外部收到您的请求,然后尝试向 localhost 发出 HTTP 请求时,它实际上是在向其 OWN localhost 发出请求(因此在容器内)而不是您机器的localhost。要解决这个问题,不要尝试向localhost 发送请求,而是让docker 内的应用程序将请求发送到host.docker.internal:DESIRED_PORT,这会告诉docker 使用它的主机的localhost

    您可以在此处阅读更多相关信息:

    https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

    【讨论】:

    • 感谢您的回复 - 这是正确的。我必须在我的服务 docker-compose 文件中将它添加到网络中,并更改端口(因为我使用的是外部端口而不是内部端口)。
    猜你喜欢
    • 2020-03-26
    • 2021-11-03
    • 2018-07-30
    • 2017-07-20
    • 2020-01-24
    • 2020-02-17
    • 2018-11-16
    • 2020-10-28
    • 2022-01-25
    相关资源
    最近更新 更多