无法在浏览器上访问Docker nodejs容器

时间:2018-07-28 17:13:35

标签: javascript node.js docker dockerfile docker-toolbox

我正在使用Windows ver 10家庭版,因此我使用的是“用于Windows的docker工具箱”,其中我的docker客户端是Windows / amd64,服务器是linux / amd64。

我用三个文件构建了一个非常简单的nodejs应用程序。

server.js

/**


* Created by farhanx on 7/28/2018.
 */
'use strict';

const express = require('express');

// Constants
const PORT = 5000;
const HOST = 'localhost';

// App
const app = express();


app.get('/', function (req, res) {

    res.send('Hello world\n');
});

app.get('/students', function (req, res) {

    res.send('student page\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 <first.last@example.com>",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.16.1"
  }
}

Docker文件

FROM node:8
# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm install --only=production

# Bundle app source
COPY . .

EXPOSE 5001
CMD [ "npm", "start" ]

然后我已经成功构建了我的docker镜像并运行了该命令

  

docker run -p 5001:5000 farhan / mynode

因为我已经在nodejs服务器文件和docker文件中提到服务器的端口5000,所以我将5001公开为端口。

现在它可以正常运行并在控制台上显示nodejs服务器正在运行,但是每当我使用localhost:5001时,它就会显示找不到页面。这意味着docker容器可以正常工作,但浏览器无法访问。

2 个答案:

答案 0 :(得分:1)

由于使用的是工具箱,因此必须通过http://linux_docker_host_ip:5001访问浏览器中的应用。

要了解主机ip,请转到virtualbox,然后查看docker计算机的ip地址。通常,在虚拟框中单击虚拟机时,您会在右下角找到一个网络图标。默认情况下,IP为“ 192.168.99.100”

答案 1 :(得分:1)

暴露端口意味着您让请求通过该端口。您必须公开端口5000,而不是5001。

public static byte[] xor(byte[]... arrays) {
    int len = 0;
    for (byte[] array : arrays)
        len = Math.max(len, array.length);
    byte[] result = new byte[len];
    for (int i = 0; i < len; i++) {
        byte b = 0;
        for (byte[] array : arrays) 
            b ^= i < array.length ? array[i] : 0; 
        result[i] = b;
    }
    return result;
}

此外,您不应将Express应用程序的HOST设置为EXPOSE 5000 。如果这样做,则只有localhost(容器)才能发出请求。

通常,您不设置主机(默认为0.0.0.0并接受所有内容):

localhost