无法在浏览器上访问 Docker nodejs 容器
Unable to access the Docker nodejs container on the browser
我在家里使用 windows 版本 10,所以我使用 "docker toolbox for windows",其中我的 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 容器以某种方式工作正常,但浏览器无法访问。
由于您使用的是工具箱,因此您必须通过 http://linux_docker_host_ip:5001 在浏览器中访问应用程序。
要知道主机 ip,请转到 virtualbox,然后查看 docker 机器的 ip 地址。通常,当您在虚拟框中单击 vm 时,您会在右下角找到一个网络图标。默认情况下,IP 为“192.168.99.100”
公开端口意味着您允许请求该端口的请求。您必须公开端口 5000 而不是 5001。
EXPOSE 5000
此外,您不应将 Express 应用的主机设置为 localhost
。如果这样做,只有本地主机(容器)才能发出请求。
通常,您不设置主机(它默认为 0.0.0.0 并接受所有内容):
app.listen(PORT);
我在家里使用 windows 版本 10,所以我使用 "docker toolbox for windows",其中我的 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 容器以某种方式工作正常,但浏览器无法访问。
由于您使用的是工具箱,因此您必须通过 http://linux_docker_host_ip:5001 在浏览器中访问应用程序。
要知道主机 ip,请转到 virtualbox,然后查看 docker 机器的 ip 地址。通常,当您在虚拟框中单击 vm 时,您会在右下角找到一个网络图标。默认情况下,IP 为“192.168.99.100”
公开端口意味着您允许请求该端口的请求。您必须公开端口 5000 而不是 5001。
EXPOSE 5000
此外,您不应将 Express 应用的主机设置为 localhost
。如果这样做,只有本地主机(容器)才能发出请求。
通常,您不设置主机(它默认为 0.0.0.0 并接受所有内容):
app.listen(PORT);