问题描述
我尝试运行 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 地址分配给容器,它都会处理所有请求。