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
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
的一种提升,因为虽然这不是我实际使用的解决方案,但我怀疑在这个响应中有有用的信息。这对我很有用。是的,我觉得这很简单,谢谢。这对我很有用。是的,我觉得很简单,谢谢。