node.js - 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,这允许容器接收来自主机的请求。
解决方案
使用普通的香草 express.js 设置,这可以按预期工作。因此,它必须与您的 Vue 应用程序有关。
请尝试以下步骤来查找问题的根源:
- 检查容器是否已启动或是否立即退出 (
docker ps
) - 如果容器运行,请检查端口映射是否设置正确。它需要是
0.0.0.0:8080->8080/tcp
- 检查容器的日志 (
docker logs <container_name>
) - 连接到容器 (
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”以防止来自主机系统以外的连接。
推荐阅读
- javascript - 将容器内的 div 从边缘移动到边缘
- arrays - Ruby on Rails:将哈希数组中的值与数组数组组合(或附加?)
- apollo - Apollo 文件上传 & React Apollo 上传客户端,零字节文件
- if-statement - 'If' 和 'Else' 都在我的 Windows 批处理文件中执行
- javascript - Javascript document.controller.setValue getValue(this)
- sql-server - 基于状态列的活跃用户的日期总和
- python - Redis 集群键/空间事件通知
- flutter - Flutter:如何通过extends继承widget的构造函数
- python - 使用 Selenium 获取天气数据
- android - 如何在android studio中制作内阴影形状