Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我的express.js hello world和Docker设置有什么问题?_Node.js_Docker_Express - Fatal编程技术网

Node.js 我的express.js hello world和Docker设置有什么问题?

Node.js 我的express.js hello world和Docker设置有什么问题?,node.js,docker,express,Node.js,Docker,Express,我试图做两件事 使用Node/Express.js创建一个基本的“hello world”类型的应用程序 将该应用程序托管在docker中(目前在我的本地系统上,即 Mac操作系统) 这是我在文件夹方面所拥有的: root of application -> node_modules -> .dockerignore -> Dockerfile -> index.js -> package-lock.json -> package.json 我的Docker

我试图做两件事

  • 使用Node/Express.js创建一个基本的“hello world”类型的应用程序
  • 将该应用程序托管在docker中(目前在我的本地系统上,即 Mac操作系统)
  • 这是我在文件夹方面所拥有的:

    root of application
    -> node_modules
    -> .dockerignore
    -> Dockerfile
    -> index.js
    -> package-lock.json
    -> package.json
    
    我的Dockerfile:

    FROM node:lts
    WORKDIR "/app"
    COPY package.json /app/
    RUN cd /app; npm install
    COPY . /app
    EXPOSE 8888
    CMD ["node", "index.js"]
    
    My index.js:

    const express = require('express')
    const app = express()
    const port = 8888
    app.get('/', (req, res) => res.send('Hello World!'))
    app.listen(port, () => console.log(`Example app listening on port ${port}!`))
    
    My package.json:

    {
      "name": "my-software",
      "version": "1.0.0",
      "description": "My Software",
      "main": "index.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "author": "Me",
      "license": "ISC",
      "dependencies": {
        "express": "^4.16.4"
      }
    }
    
    我的dockerignore:

    node_modules/
    
    这就是我正在做的,试图让它运行

    1) 首先,我通过运行
    npm install
    然后运行
    node index.js
    来验证我的express应用程序是否独立工作。我可以看到它正在运行,并且可以在localhost:8888的浏览器上使用

    2) 运行
    docker build.
    后,我得到如下结果:

    Sending build context to Docker daemon  18.94kB
    Step 1/7 : FROM node:lts
     ---> 75a3a4428e1d
    Step 2/7 : WORKDIR "/app"
     ---> Using cache
     ---> 57a5a3028928
    Step 3/7 : COPY package.json /app/
     ---> Using cache
     ---> 74939286881b
    Step 4/7 : RUN cd /app; npm install
     ---> Using cache
     ---> f7e142ba9040
    Step 5/7 : COPY . /app
     ---> Using cache
     ---> ea7cc365795d
    Step 6/7 : EXPOSE 8888
     ---> Using cache
     ---> 82297fe77ca8
    Step 7/7 : CMD ["node", "index.js"]
     ---> Using cache
     ---> e2fb0c6c00a3
    Successfully built e2fb0c6c00a3
    
    3) 在此之后,我运行
    docker运行e2fb0c6c00a3
    (使用步骤2中构建的任何内容的散列)


    注意:在控制台中,它看起来好像正在运行。我看到一条消息说“示例应用程序侦听端口8888!”,但当我在浏览器中重新加载locahost:8888时,我什么也没有得到。我在这里遗漏了什么?

    如果您想从您的主机系统访问在容器中运行的节点上的web服务器,您需要以某种方式指定有效的主机名

    你能做的最简单的事情就是在启动docker时使用
    host
    网络模式。然后您将能够连接到
    localhost

    docker run -it --net=host blahblah
    

    否则,如果不指定主机网络,则需要知道容器的ip地址。然后使用指定的地址连接到它。

    如果您想从主机系统访问节点上的web服务器(该节点在容器中运行),您需要指定有效的主机名

    你能做的最简单的事情就是在启动docker时使用
    host
    网络模式。然后您将能够连接到
    localhost

    docker run -it --net=host blahblah
    
    否则,如果不指定主机网络,则需要知道容器的ip地址。并使用指定的地址连接到它。

    请注意以下事项:

    EXPOSE指令实际上并不发布端口。 ... 要在运行容器时实际发布端口,请在docker run上使用-p标志来发布和映射一个或多个端口

    因此,您应该使用docker run-p 8888:8888 e2fb0c6c00a3

    注意以下几点:

    EXPOSE指令实际上并不发布端口。 ... 要在运行容器时实际发布端口,请在docker run上使用-p标志来发布和映射一个或多个端口


    因此,您应该使用
    docker run-p 8888:8888 e2fb0c6c00a3

    --net=host
    是一种黑客行为,最好正确设置docker网络。特别是,了解Docker中的
    localhost
    实际含义非常重要。另外,您可能永远也不应该查找容器的Docker内部IP地址,它有许多微妙之处和陷阱,您几乎不需要它。我同意,
    --net=host
    违反了容器隔离,这一点毫无疑问。但这并不是禁止的,我只是想为潜入集装箱运输提供快速解决方案。长期计划ofc应该包括网络隔离、容器编排工具等,但是对于docker来说,
    --net=host
    是一种
    hello world
    ,因为这不是我实际使用的解决方案,我怀疑在这个回复中有有用的信息。
    --net=host
    是一种黑客行为,最好正确设置Docker网络。特别是,了解Docker中的
    localhost
    实际含义非常重要。另外,您可能永远也不应该查找容器的Docker内部IP地址,它有许多微妙之处和陷阱,您几乎不需要它。我同意,
    --net=host
    违反了容器隔离,这一点毫无疑问。但这并不是禁止的,我只是想为潜入集装箱运输提供快速解决方案。长期计划,ofc,应该包括网络隔离、容器编排工具等,但是
    --net=host
    hello world
    对于
    docker
    的一种提升,因为虽然这不是我实际使用的解决方案,但我怀疑在这个响应中有有用的信息。这对我很有用。是的,我觉得这很简单,谢谢。这对我很有用。是的,我觉得很简单,谢谢。