微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 node.js 无法访问页面 http://0.0.0.0:8080/

如何解决使用 node.js 无法访问页面 http://0.0.0.0:8080/

我尝试运行 Docker。我创建了文件 server.js:

'use strict';

const express = require('express');

// константы
const port = 8080;
const host = '0.0.0.0';

// приложение
const app = express();
app.get('/',(req,res) => {
    res.send('Hello World');
});

app.listen(port,host);
console.log(`running on http://${host}:${port}`);

我通过 npm install 创建了 package.json 和 init package.lock

{
  "name": "docker","version": "1.0.0","description": "node.js on docker","main": "server.js","scripts": {
    "test": "echo \"Error: no test specified\" && exit 1","start": "node server.js"
  },"keywords": [
    "node","docker"
  ],"author": "Molchanova Tatyana","license": "ISC","dependencies": {
    "express": "^4.17.1"
  }
}

然后我创建了一个 Dockerfile

FROM node:12

# создание директории приложения
workdir /usr/src/app

# установка зависимостей
# символ астериск ("*") используется для того чтобы по возможности
# скопировать оба файла: package.json и package-lock.json
copY package*.json ./

RUN npm install
# Если вы создаете сборку для продакшн
# RUN npm ci --only=production

# копируем исходный код
copY . .

# EXPOSE декларирует,что можем пробросить порт 8080,но на самом деле не пробрасывает
EXPOSE 8080
CMD [ "node","server.js" ]

当我创建图像时: docker build -t hello-world .

它在控制台中运行: 在 http://0.0.0.0:8080

上运行

然后我尝试使用外部和内部 8080 端口运行它: docker run --rm --name web -p 8080:8080 hello-world

当我通过链接 http://0.0.0.0:8080 访问时 - 页面为空,无法访问站点 而且页面不仅无法通过 docker run 访问,而且当我在终端中使用命令运行 server.js 时 - 它无法访问。

仅当我指向 localhost

const host = '127.0.0.1';

代替

const host = '0.0.0.0';

在 server.js 文件中 它在终端运行 但不能在浏览器中使用 Dockerfile 运行 - docker run --rm --name web -p 8080:8080 hello-world

请帮忙!

在主机文件中一切正常,没有 0.0.0.0

解决方法

序言

Docker 容器应该被视为一个单独的节点,它与主机(运行 Docker 的机器)没有任何连接。主机和容器通过网络进行通信,因此每个都有自己的网络接口。并且每台连接到某个网络的机器都应该有一个 IP 地址,以便可以访问。

创建容器时,Docker 会为该容器分配一些内部 IP 地址,并使用它来转发请求。当您运行带有选项 --name web -p 8080:8080 的容器时,Docker 会将来自主机 127.0.0.1:8080 的请求转发到 web 容器的 IP 地址和该容器的端口 8080。

TL;DR

您应该在 docker 镜像中使用 const host = '0.0.0.0';,但通过 http://127.0.0.1:8080 从主机访问您的应用程序。

什么是 127.0.0.1

127.0.0.1 是回环接口的保留地址,基本上是将流量传输到同一个网络节点上,节点外无法访问该接口。

因此,当您设置 const host = '127.0.0.1' 时,您使您的应用程序只能从这个 docker 容器通过 URL http://127.0.0.1:8080 访问。

什么是 0.0.0.0

0.0.0.0 也是一个保留地址,当用作侦听 IP 地址时,它保留给“本地机器上的所有 IP 地址”。因此,当您为 0.0.0.0 创建侦听器时,无论将哪个 IP 地址分配给容器,它都会处理所有请求。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。