我正在尝试做两件事
这是我的文件夹管理工具:
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时,我什么也没得到。我在这里想念什么?
答案 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