我有以下文件:Dockerfile
:
FROM node:8
# Create app directory
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "start" ]
server.js
:'use strict';
const express = require('express');
// Constants
const PORT = 8080;
const HOST = '0.0.0.0';
// App
const app = express();
app.get('/', (req, res) => {
res.send('Hello world\n');
});
app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
package.json
:{
"name": "docker_web_app",
"version": "1.0.0",
"description": "Node.js on Docker",
"author": "First Last <[email protected]>",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"dependencies": {
"express": "^4.16.1"
}
}
.dockerignore
:node_modules
npm-debug.log
然后我构建Docker镜像:
docker build -t nodeapp -f ./Dockerfile .
它有效,创建了图像。然后我运行它:
docker run -p 49160:8080 -d nodeapp
和执行以下:
docker exec -it <container id> /bin/bash
如果输入
curl -i localhost:49160
,我会得到Failed to connect to localhost port 49160: Connection refused
。尽管如此,如果我键入
curl -i localhost:8080
没关系:HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 12
ETag: W/"c-M6tWOb/Y57lesdjQuHeB1P/qTV0"
Date: Wed, 06 Mar 2019 23:20:41 GMT
Connection: keep-alive
Hello world
但是,我无法在原始系统上的Chrome中获得
localhost:8080
(也不是localhost:49160
),即完全不在Docker中。是否可以在浏览器中运行dockered应用程序?如何修复它以使其正常工作?
编辑:
1)我必须使用
docker-machine ip
checkout IP地址2)转到:49160
最佳答案
简短答案:
docker run -p 8080:8080 -d nodeapp
解释:
当您尝试从实例内部访问端口49160时,通常会说拒绝连接,因为此端口已从您的容器映射到您的系统。因此,只有您的系统才能检查该端口。
我尝试了您的文件,并且可以使用http://localhost:49160正确访问服务器
如果要从系统访问端口8080,请在运行容器时更改映射端口:
docker run -p 8080:8080 -d nodeapp
# -p portAccessibleFromYourSystem:portYouWantToShare