代码之家  ›  专栏  ›  技术社区  ›  sonoerin

Docker中的nodejs没有看到连接

  •  2
  • sonoerin  · 技术社区  · 7 年前

    我有一个nodejs/vue应用程序,我可以运行良好,直到我试图把它放在一个docker容器。我使用的项目结构如下:

    enter image description here

    当我这样做的时候 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                                                                                                                                                       
    

    然后我可以在本地主机8080上通过浏览器连接

    这是我的档案:

    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 build -t myproject . 并查看通过 docker images

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

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

    另外,当我从命令行运行容器时,它似乎锁定了,所以我必须关闭终端。不确定这是否相关…

    更新: 我试着跟踪Docker日志,比如

    Docker日志--跟踪

    而且除了我的应用程序在本地主机上运行的最后一行之外,没有别的东西:8080

    这似乎表明我的http请求从未进入我的容器,对吧?

    我也尝试过这个建议

    cmd node_modules/.bin/webpack开发服务器——主机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
    

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

    回答

    结果发现我的config/index.js中有这个:

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   JSchirrmacher    7 年前

    使用一个普通的vanilla 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

    在讨论了chat中的问题之后,我们发现在vue.js配置中存在对“localhost”的限制。将其更改为“0.0.0.0”后,也接受来自容器主机系统的连接。

    对于Docker 18.03及以上版本,也可以将主机设置为“host.docker.internal”,以防止主机系统以外的连接。

    推荐文章