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

时间:2018-12-04 14:18:21

标签: node.js docker express

我正在尝试做两件事

  1. 使用Node / Express.js创建一个基本的“ hello world”类型的应用程序。
  2. 将该应用托管在docker中(目前在我的本地系统上, Mac OS)

这是我的文件夹管理工具:

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"]

我的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}!`))

我的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应用程序是否独立运行。我可以看到它正在运行,并且可以在本地主机上的浏览器上找到: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 run e2fb0c6c00a3(使用步骤2中构建的哈希值)

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

2 个答案:

答案 0 :(得分:1)

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

您能做的最简单的事情是在启动docker时使用host网络模式。这样您就可以连接localhost

docker run -it --net=host blahblah

否则,如果您未指定host网络,则需要知道ip address您的容器。并使用指定的地址连接到它。

答案 1 :(得分:1)

请注意以下in the Docker documentation for EXPOSE

  

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

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