【问题标题】:Page http://0.0.0.0:8080/ is not accessible with node.js页面 http://0.0.0.0:8080/ 无法使用 node.js 访问
【发布时间】:2021-07-13 11:03:42
【问题描述】:

我尝试运行 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" ]

当我创建 iamge 时: 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 时 - 它无法访问。

只有当我指向本地主机时

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

请帮忙!

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

【问题讨论】:

    标签: node.js docker localhost port hosts


    【解决方案1】:

    序言

    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是loopback接口的保留地址,基本上将流量转移到同一个网络节点上,从节点外无法到达这个接口。

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

    什么是 0.0.0.0

    0.0.0.0 也是一个保留地址,在用作侦听 IP 地址时保留“本地计算机上的所有 IP 地址”。因此,当您为 0.0.0.0 创建一个侦听器时,它将为所有请求提供服务,而不管为容器分配了哪个 IP 地址。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多