按以下方式创建了泊坞窗文件:
FROM node:boron
ADD package.json package.json
RUN npm install
ADD . .
EXPOSE 4500
CMD ["node","main.js"]
构建应用
docker build -t“appname”
运行应用
docker run -it“appname”
在main.js
内,我有:
var express = require("express");
var app = express();
var path = require('path');
var http = require('http');
var https = require('https');
var nodemailer = require('nodemailer');
var bodyParser = require('body-parser');
var request = require("request");
var port = process.env.PORT || 3001;
app.set('port', (port));
app.listen(app.get('port'), function () {
console.log('Node app is running on port', app.get('port'));
});
//app.use('/', express.static(path.join(__dirname, '/public_html')))
app.use('/', express.static(__dirname + '/public_html'));
app.use(bodyParser.json({limit: '5mb'}));
app.use(bodyParser.urlencoded({
limit: '5mb',
extended: false
}));
app.get('/', function(request, response) {
response.render('public_html/');
});
//app.get('/', function (req, res, next) {
// res.sendFile('/index.html');
//});
app.use('*', function (req, res, err) {
// console.log('error: ', err);
});
当我使用docker命令'docker run -it“appname”`运行应用程序时,我得到了控制台:
Node app is running on port 3001
但是当我浏览时,页面为空或浏览器/输出/视图中未加载任何内容。它应该从index.html
response.render('public_html/');
答案 0 :(得分:4)
您需要明确公开应用程序应运行的端口:
docker run -p 3001:3001 your-node-image
然后,您可以在http://localhost:3001下的docker主机上访问容器的服务,因为-p 3001:3001
将主机端口3001(参数中的第一个3001)绑定到容器' s端口3001(第二个3001)。
EXPOSE
仅描述了应用程序公开的端口(位于Dockerfile 4500和程序端口3001中......?为什么它们不同?)。使用-p
发布端口也是访问容器see the docs:
EXPOSE指令通知Docker容器在运行时侦听指定的网络端口。 EXPOSE不会使容器的端口可供主机访问。为此,您必须使用-p标志发布一系列端口,或使用-P标志发布所有公开的端口。
此外,标记-it
似乎对您的服务无效。当您想要进行交互式会话时需要这些标志,例如当你在容器中启动shell时。
请在此处查看有关端口曝光in the official documentation
的更多信息