node.js - 将我的 Express docker 容器暴露给全世界有困难

标签 node.js express docker docker-compose dockerfile

我有一个使用express运行的 Node 应用程序,以在docker容器中运行网络服务器。我的 Node 应用程序看起来有点像这样:

'use strict'
const childProcess = require('child_process');
const express = require('express');
... // so many requires


const main = async () => {
  var app = express();

  app.get('/status', function (req, res) {
    res.send('Hello World')
  });

  app.listen(8080,'0.0.0.0');

  ... // so much more code

}

main().catch((err) => {
  console.error(err);
});

我不相信我的 Node 应用程序有任何问题,因为当我使用以下命令登录我的 docker 容器时: docker exec -it blacklist-service_blacklist-service_run_1/bin/bash

并运行:curl localhost:8080/status

它返回Hello World

因此,这让我相信我的 docker 配置有问题,因为当我从主机运行: curl localhost:8080/status 时,我收到: curl: (7)无法连接到本地主机端口8080:连接被拒绝

所以......我的 Dockerfile 看起来像这样:

FROM ubuntu:bionic

RUN apt-get update && apt-get -qq install \
  curl \
  git \
  gnupg2 \
  locales \
  netcat \
  python3-pip

RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

RUN pip3 install abydos \
    num2words \
    simplejson \
    unidecode

RUN curl -sL https://deb.nodesource.com/setup_10.x | bash
RUN apt-get -qq install nodejs
RUN npm install npm@latest -g

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

RUN npm install -g \
  Eficode/wait-for

RUN npm install \
    express \
    googleapis \
    uuid

COPY src/ .
COPY bin/ ./bin

EXPOSE 8080

ENTRYPOINT /usr/lib/node_modules/wait-for/wait-for ${WAIT_FOR} -t 20 -- node server.js

(我知道,我知道,但这是使用 ubuntu 作为我们的 docker 镜像的要求)

然后我有一个如下所示的 docker-compose 文件:

version: "3.6"

services:
  rabbitmq:
    image: "rabbitmq:latest"
    ports:
      - "15672:15672"
      - "5672:5672"
    volumes:
      - "./enabled_plugins:/etc/rabbitmq/enabled_plugins"
  blacklist-service:
    environment:
      NODE_ENV: development
    image: ${DOCKER_REGISTRY}unicorn/blacklist-service:${DOCKER_IMAGE_LABEL:-latest}
    build:
      context: .
      dockerfile: ./debugging/Dockerfile
    ports:
      - "0.0.0.0:8080:8080"
    depends_on:
      - rabbitmq
    environment:
      - WAIT_FOR=rabbitmq:5672
      - AMQP_SHARED_HOST=rabbitmq
      - AMQP_USERNAME=guest
      - AMQP_PASSWORD
      - AMQP_EXCHANGE=amq.topic
      - AMQP_TOPIC=topic
      - AMQP_JOB=state51::Job::RunQAForFormat
      - AMQP_QUEUE
      - AMQP_PATTERN=#
      - AMQP_SHARED_PORT=5672
      - AMQP_SEND_EXCHANGE=firehose
      - BLACKLIST_SERVICE_SECRET
      - GOOGLE_PRIVATE_KEY
      - GOOGLE_CLIENT_EMAIL
      - GOOGLE_CLIENT_ID
      - GOOGLE_API_KEY

./debugging/Dockerfile 指的是我上面列出的 Dockerfile。

然后我通过:docker-compose -f docker-compose.local.yml build构建我的图像并使用:docker-compose -f docker-compose.local.yml运行它运行 blacklist-service (docker-compose.local.yml 是上述 docker-compose 文件的名称)。

那么我暴露我的服务器哪里出了问题?运行 Docker 社区:在我的 Mac 上运行版本 18.06.1-ce-mac73 (26764)

最佳答案

使用docker-compose run [service-name]时需要添加参数--service-ports

所以正确的命令是:docker-compose -f docker-compose.local.yml run --service-ports blacklist-service,它允许我 curl 到localhost:8080/状态并得到我期望的响应。

关于node.js - 将我的 Express docker 容器暴露给全世界有困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53213726/

相关文章:

javascript - 成功ajax后不需要的重定向到POST url

mysql - nodejs - passport.use 回调返回 dataValues 和 _previousDataValues 而不是普通对象

linux - 以前的 apt-get update & install Docker 层在每次构建期间都被删除

重启kubernetes后mongodb容器的数据变成 "read-only",用glusterfs存储?

node.js - 使用 DynamoDB 批量更新插入

node.js - 将环境变量传递给特定于部署的 travis

javascript - NodeJS readdirSync() 未执行

javascript - 尝试访问 Azure Postgres 灵活数据库时,对部署在 Azure 应用服务上的 Nodejs 服务器的请求超时

javascript - if/else 语句删除 Jade 模板中的选择选项

mysql - 更改 dockerized MySQL 数据库中的模式