【问题标题】:Error: connect ECONNREFUSED 0.0.0.0:8000 when hitting Docker containerised Node.js app endpoint错误:在访问 Docker 容器化 Node.js 应用程序端点时连接 ECONNREFUSED 0.0.0.0:8000
【发布时间】:2021-05-16 19:39:15
【问题描述】:

我刚刚开始使用 Docker 和面团,我成功地从它创建了一个图像和一个容器 我没有成功通过邮递员连接到容器的端口,我得到了Error: connect ECONNREFUSED 0.0.0.0:8000

在我的 server.js 文件中,我有:

const app = require('./api/src/app');

const port = process.env.PORT || 3000; // PORT is set to 5000

app.listen(port, () => {
  console.log('App executing to port ', port);
});

在我的 index.js 中有:

const express = require('express');

 const router = express.Router();
 
 router.get('/api', (req, res) => {
   res.status(200).send({
     success: 'true',
     message: 'Welcome to fixit',
     version: '1.0.0',
   });
 });
 
 module.exports = router;

因此,如果我使用 npm startnodemon server.js 运行我的应用程序,localhost:3000/api 端点将按预期工作。

然后我使用命令docker build . -t fixit-serverDockerfile 为我的应用程序构建一个docker 映像:

FROM node:15.14.0

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package.json package.json
COPY package-lock.json package-lock.json

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 5000

# CMD ["npm", "start"]
CMD npm start
# CMD ["nodemon", "server.js"]

并使用命令docker run -d -p 8000:5000 --name fixit-container fixit-server tail -f /dev/null运行容器

并用docker ps -a 列出容器表明它正在运行:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                    NAMES
da0e4ef12402   fixit-server   "docker-entrypoint.s…"   9 seconds ago   Up 8 seconds   0.0.0.0:8000->5000/tcp   fixit-container

但是当我到达端点0.0.0.0:8000/api时,我得到了 ECONNREFUSED 错误。 我尝试了CMD ["npm", "start"]CMD npm start,但我都得到了错误。 你能知道我做错了什么吗?

【问题讨论】:

  • 你为什么docker run ... tail -f /dev/null?那个“什么都不做”命令运行而不是你的服务器。

标签: node.js docker npm dockerfile


【解决方案1】:

更新:

@Vincenzo 使用的是docker-machine,为了能够检查应用程序是否正常运行,我们需要在终端中执行以下命令:

docker-machine env

结果是:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/Users/vinnytwice/.docker/machine/machines/default"
export DOCKER_MACHINE_NAME="default"

然后根据DOCKER_HOST 的值,我们点击192.168.99.102:8000/api 并且它正在工作。


我认为问题在于您从未将 PORT 环境变量设置为 5000

EXPOSE docker 命令是禁止操作。这意味着它什么也不做,只是让开发人员知道您正在暴露端口 5000。您可以在Docker documentation 中阅读它。

您需要设置一个环境变量,或者在运行时将一个环境变量传递给容器,以明确告诉它PORT 是5000。

方法一:

您可以像下面这样更改您的 Dockerfile:

FROM node:15.14.0

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package.json package.json
COPY package-lock.json package-lock.json

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

ENV PORT=5000

EXPOSE $PORT

# CMD ["npm", "start"]
CMD npm start
# CMD ["nodemon", "server.js"]

方法二:

只需使用以下命令即可运行您的容器:

docker run -d -p 8000:5000 --name fixit-container --env PORT=5000 fixit-server

【讨论】:

  • @Vincenzo 我的回答解决了你的问题吗?
  • 不幸的是行为相同..我尝试了这两种方法,并再次尝试CMD ["npm", "start"]CMD npm start,但这里没有运气..
  • 您是否尝试使用127.0.0.1:8000/api 进行连接?另外,如果你安装了 Docker Desktop,你能检查你的容器的日志吗?您还可以使用docker logs <container_id> 获取容器的日志
  • 是的,我试过了,但它也不起作用,我在旧 Mac 上,所以我不能使用 Docker 桌面,我使用 docker-machine
猜你喜欢
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多