错误:在访问Docker容器化Node.js应用程序端点时连接ECONNREFUSED 0.0.0.0:8000



我刚开始使用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-server和这个Dockerfile:为我的应用程序构建一个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

但是当我到达端点CCD_ 9时,我得到ECONNREFUSED错误。我尝试了CMD ["npm", "start"]CMD npm start,但两种方式都出现了错误。你知道我做错了什么吗?

更新:

@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

EXPOSEdocker命令是一个no-op。这意味着它什么都不会做,只是让开发人员知道您正在公开端口5000。您可以在Docker文档中阅读它。

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

方法1:

您可以更改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"]

方法2:

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

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

相关内容

最新更新