我有以下文件:
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

09-05 05:24