【问题标题】:Error: connect ECONNREFUSED 127.0.0.1:3003 Docker containers错误:连接 ECONNREFUSED 127.0.0.1:3003 Docker 容器
【发布时间】:2019-04-21 01:41:41
【问题描述】:

我有 3 个应用程序。网络、订单和支付,都在单独的 docker 容器中运行

例如在我的订单应用中。我有这条调用支付api的路由

router.post('/order-test', (req, res) => {
   let data = "Hello"

   // Call the payment api by using Axios
   axios.post('http://localhost:3003/payment-test', { data: data } )
     .then((response) => {
        console.log(response)
      })
     .catch((error) {
         console.log(error)
      })

})

那么它总是会返回这个错误

Error: connect ECONNREFUSED 127.0.0.1:3003

我的假设是 docker 容器无法使用 localhost 相互通信

我的 docker-compose 文件

version: "3"
services:
  web:
    build: "./web"
    ports:
      - "3000:3000"

  order:
    build: "./order"
    ports:
      - "3001:3000"

  payment:
    build: "./payment"
    ports:
      - "3003:3000"

用于订单和付款的 docker 文件(它们共享相同的代码库)

#-- Build
FROM node:8-alpine

COPY . /src

WORKDIR /src

RUN npm install --production

EXPOSE 3000

CMD npm start

我该如何解决这个问题?

【问题讨论】:

  • 要调用支付应用程序,您的路线应该类似于http://payment:3000/payment-test。因为在 docker-compose network app 内部可以通过服务名看到对方。

标签: node.js docker


【解决方案1】:

如评论中所述,您应该将 localhost 替换为服务名称,例如payment,然后你可以直接指向被暴露的端口payment:3000。我认为在这种情况下你应该使用expose 关键字而不是ports。例如

expose:
  - 3000

如果您倾向于更改服务名称,并且您也只想绑定到主机端口,您也可以使用广播地址0.0.0.0:3003。这不需要更改您当前的配置。

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 2022-08-21
    • 1970-01-01
    • 2020-05-04
    • 2020-03-19
    • 1970-01-01
    • 2019-03-15
    • 2021-03-14
    • 1970-01-01
    相关资源
    最近更新 更多