首页 > 解决方案 > Docker 中的 NodeJS 看不到连接

问题描述

我有一个 NodeJS/Vue 应用程序,在我尝试将它放入 Docker 容器之前我可以正常运行。我正在使用像这样的项目结构:

在此处输入图像描述

当我这样做时,npm run dev 我得到输出:

listmymeds@1.0.0 dev /Users/.../projects/myproject
webpack-dev-server --inline --progress --config build/webpack.dev.conf.js

然后它在给我消息之前构建了许多模块:

 DONE  Compiled successfully in 8119ms                                                                                                                                                                  
 I  Your application is running here: http://localhost:8080                                                                                                                                                       

然后我可以通过浏览器在 localhost:8080 进行连接

这是我的 Dockerfile:

FROM node:9.11.2-alpine
RUN mkdir -p /app
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
CMD npm run dev
EXPOSE 8080  

然后我创建一个 docker 镜像docker build -t myproject .并查看通过docker images

然后我运行docker run -p 8080:8080 myproject并收到一条消息,表明我的应用程序正在这里运行:localhost:8080

但是,当我使用浏览器或 Postman 获取 localhost:8080 时,没有响应。

此外,当我从命令行运行容器时,它似乎已锁定,因此我必须关闭终端。虽然不确定这是否相关......

更新:我尝试遵循 Docker 日志,例如

码头工人日志--关注

除了我的应用程序在 localhost:8080 上运行的最后一行之外,别无其他

这似乎表明我的 http 请求永远不会进入我的容器,对吗?

我也试过这个建议

CMD node_modules/.bin/webpack-dev-server --host 0.0.0.0

但这甚至没有开始。

我突然想到,可能是Docker网络问题,可能导致之前尝试学习kong api。所以我跑过去docker network ls看看

NETWORK ID          NAME                DRIVER              SCOPE
1f11e97987db        bridge              bridge              local
73e3a7ce36eb        host                host                local
423ab7feaa3c        none                null                local

我无法停止、断开或删除这些网络中的任何一个。我认为“桥”可能是 Kong 创建的,但它不会让我敲它。没有其他容器在运行,我已经删除了除了我在这里使用的图像之外的所有图像。

回答

事实证明,我的 config/index.js 中有这个:

module.exports = {
  dev: {
    // Various Dev Server settings
    host: 'localhost', 
    port: 8080,

根据 Joachim Schirrmacher 的出色帮助,我将主机从 localhost 更改为 0.0.0.0,这允许容器接收来自主机的请求。

标签: node.jsdocker

解决方案


使用普通的香草 express.js 设置,这可以按预期工作。因此,它必须与您的 Vue 应用程序有关。

请尝试以下步骤来查找问题的根源:

  1. 检查容器是否已启动或是否立即退出 ( docker ps)
  2. 如果容器运行,请检查端口映射是否设置正确。它需要是0.0.0.0:8080->8080/tcp
  3. 检查容器的日志 ( docker logs <container_name>)
  4. 连接到容器 ( docker exec -it <container_name> sh) 并检查是否node_modules存在并包含所有

编辑

看到您对问题的最后更改,我建议使用以下-dit选项启动容器:docker run -dit -p 8080:8080 myproject使其进入后台,这样您就不需要通过关闭终端来硬停止它。

通过检查确保只有一个图像容器运行docker ps

编辑2

在聊天中讨论了这个问题后,我们发现在 Vue.js 配置中对 'localhost' 有限制。将其更改为“0.0.0.0”后,也接受来自容器主机系统的连接。

使用 Docker 版本 18.03 及更高版本,还可以将主机设置为“host.docker.internal”以防止来自主机系统以外的连接。


推荐阅读