如何使快递在 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.
我正在尝试使用 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.