如何使快递在 docker 容器外可见

How to make express visible outside docker container

我正在尝试使用 nodejs/react env 设置 docker 用于本地开发目的,这是客户端的 Dockerfile:

# Pull Docker Hub base image
FROM node:14.16.0-alpine3.10
# Set working directory
WORKDIR /usr/app
# Install app dependencies
COPY package*.json ./
RUN npm install -qy
# Copy app to container
COPY . .
# Run the "dev" script in package.json
CMD ["npm", "start"]

这是服务器的 Dockerfile:

# Pull Docker Hub base image
FROM node:14.16.0-alpine3.10
# Set working directory
WORKDIR /usr/app
# Install app dependencies
COPY package*.json ./
RUN npm install -qyg nodemon@2.0.7
RUN npm install -qy
# Copy app to container
COPY . .
# Run the "dev" script in package.json
CMD ["npm", "start"]

这是docker-compose.yml:

version: "3"
services:

  client:
    build:
      context: ./client
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    networks:
      - picstack-network
    volumes:
      - ./client/src:/usr/app/src
      - ./client/public:/usr/app/public
    depends_on:
      - server
    environment:
      - REACT_APP_SERVER=http://localhost:5000
      - CHOKIDAR_USEPOLLING=true
    command: npm start
    stdin_open: true
    tty: true

  server:
    build:
      context: ./server
      dockerfile: Dockerfile
    ports:
      - "5000:5000"
    networks:
      - picstack-network
    volumes:
      - ./server/src:/usr/app/src
    depends_on:
      - db
    environment:
      - MONGO_URL=mongodb://db:27017
      - CLIENT=http://localhost:3000
    command: nodemon -L app.js

  db:
    image: mongo:3.6.19-xenial
    ports:
      - "27017:27017"
    networks:
      - picstack-network
    volumes:
      - mongo-data:/data/db

networks:
  picstack-network:
    driver: bridge

volumes:
  mongo-data:
    driver: local

这是我的切入点 app.js:

var createError = require('http-errors');
var express = require('express');
const bodyParser = require("body-parser");
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

如果我 运行 docker-compose 起来,我可以在 http://localhost:3000 看到 react 索引,但是我看不到应该是的 express 索引在 http://localhost:5000。 docker ps 显示所有 3 个容器 运行ning 并且日志没有错误。

但是,如果我停止 docker 并且 运行 npm 在本地启动,我实际上可以在 http://localhost:5000 看到 express 索引。

所以我怀疑当我运行 docker时,http://localhost:5000只能从客户端容器访问,但我不知道如何验证它,反正当 docker 为 运行ning 时,我希望能够从外部看到 api,因此我可以使用 Postman 或类似工具。我应该改变什么来实现这个目标?

我真的是 docker 的新手并表示欢迎任何其他改进此配置的建议。

根据讨论,您没有在 app.js 中调用 listen。因此,如果您将撰写文件中的命令设置为 command: nodemon -L app.js

,您的服务器将不会启动

我建议在 app.js 文件中调用 app.listen。

app.listen(port, '0.0.0.0')

然后你可以再次使用 nodemon 作为命令。

nodemon -L app.js

By default nodemon monitors the current working directory.