【问题标题】:Bind port in docker-compose.yml doesn't workdocker-compose.yml 中的绑定端口不起作用
【发布时间】:2020-11-11 13:12:38
【问题描述】:

我有一个使用 docker-compose.yml 制作的 NodeJS 和 React 应用程序,我正在尝试将我的应用程序放在端口 :8090,但是当我执行 curl 时,我收到了这个错误

curl localhost:8090
curl: (56) Recv failure: Connection reset by peer

docker-compose.yml

version: '3.1'

services:

  web:
    build: 
      context: .
      args:
        # Variaveis do frontend
        - BACKEND_URL=http://localhost:8090
    restart: always
    container_name: petcertificados
    ports:
      - "8090:8080"
    volumes:
      - ./certificados:/usr/app/server/certificados

如果我进入我的容器,我可以访问我的网站,但如果我在外面则不能

[root@blastoise certificados]# docker exec -it petcertificados /bin/bash
root@a0d690c11c38:/usr/app/server# curl localhost:8080/api
<!DOCTYPE html>
<html>
  <head>
    <title>Certificados - Backend</title>
  </head>
  <body>
    <h3>Certificados - BackEnd</h3>
  </body>

因为在我的个人电脑上这行得通,我认为这可能是机器中的 docker 出现错误。 docker 版本是Docker version 19.03.13, build 4484c46d9d,我在 CentOS 中。我尝试使用 service docker restart 重新启动 docker 但不起作用,我不知道会发生什么。

[EDIT 1]我的 index.js,我在其中设置端口配置并启动应用程序

const express = require('express')
const app = express();
const path = require('path');
const cors = require('cors')

const { BACKEND_PORT } = require("./constants/index.js");

const CLIENT_BUILD_PATH = path.join(__dirname, '../../frontend/build');
app.use(express.static(CLIENT_BUILD_PATH));

app.use(express.json());

app.use(cors());
app.use((req, res, next) => {
    next();
})

app.get('/api', (req, res) => {
    res.sendFile(path.join(__dirname, 'views', 'index.html'));
});

app.use('/api/certificados', require('./routes/Certificados'));
app.use('/api/eventos', require('./routes/Eventos'));

app.listen(BACKEND_PORT, () => { 
    console.info(`Iniciando PETCertificados!`)
});

我尝试输入“0.0.0.0”,但这已经是 NodeJS 的默认设置

[编辑 2] Dockerfile

FROM node:14.5.0 as frontend

WORKDIR /usr/app/frontend

COPY frontend/package*.json ./
RUN npm install -qy

COPY frontend/ ./

ARG BACKEND_URL
ENV REACT_APP_BACKEND_URL ${BACKEND_URL}

RUN npm run build

FROM node:14.5.0
WORKDIR /usr/app/ 

COPY --from=frontend /usr/app/frontend/build ./frontend/build

WORKDIR /usr/app/server/
COPY backend/package*.json ./

RUN npm install -qy
COPY backend/ ./

CMD ["npm", "start"]

【问题讨论】:

  • 您能否编辑问题以包含应用程序代码,至少到设置网络侦听器的程度?此问题的常见原因是应用程序绑定到容器私有 localhost 接口 127.0.0.1,而它需要绑定到所有接口 0.0.0.0。
  • @DavidMaze 是的!我包含了这些信息!
  • 你的 Dockerfile 在这里也会有所帮助
  • @JaredBeach 就在那里!
  • 尝试将EXPOSE 8080 添加到您的dockerfile

标签: javascript node.js docker docker-compose


【解决方案1】:

通过稍微修改的 Dockerfile / app.js,我可以 curl localhost:8090 并获得响应。

Dockerfile:

FROM node:14-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 8080

CMD [ "node", "app.js" ]

App.js

const express = require('express')
const app = express();
const path = require('path');
const cors = require('cors')

const CLIENT_BUILD_PATH = path.join(__dirname, '../../frontend/build');
app.use(express.static(CLIENT_BUILD_PATH));

app.use(express.json());

app.use(cors());
app.use((req, res, next) => {
    next();
})

app.get('/', (req, res) => {
    res.send('Hello world!')
});

app.listen(8080, '0.0.0.0', () => { 
    console.info(`Iniciando PETCertificados!`)
});

docker-compose.yml 保持不变。

【讨论】:

  • 不幸的是,这不起作用。 EXPOSE 8080; CMD ["npm", "start"]app.listen(8080, '0.0.0.0', () =&gt; { console.info("Iniciando PETCertificados!") }); 我仍然得到 [root@blastoise certificados]# curl localhost:8090 curl: (56) Recv failure: Connection reset by peer 可能问题不在代码中,与我的机器有关?
  • 可能。如果您的物理机的 8080 端口上还没有运行任何东西,请尝试映射到该端口而不是 8090。所以“8080:8080”。看看是不是端口问题。否则,请尝试删除 docker 文件中除了后端(例如反应应用程序)之外的所有内容,然后查看它是否有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2022-01-05
  • 1970-01-01
  • 2017-01-24
  • 2020-05-23
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多