我似乎无法访问任何正在运行的docker容器。最新的hello-world 3是一个使用端口8080的节点应用程序。我让节点应用程序通过process. env. PORT侦听该端口。我使用npm启动脚本设置PORT=8080
,并使用docker文件暴露8080。构建容器后,我指定了一个端口。在本例中为8082 x docker run -p 8082:8080 hello-world3
从我的控制台上看着这个img,我应该可以通过转到localhost:8082看到我的应用程序的响应,是吗?
我的docker文件
FROM jkilbride/node-npm-alpine:8
WORKDIR /src
COPY package.json .
RUN npm install
COPY . .
EXPOSE 8080
CMD ["npm","start"]
package.json:
{
"name": "service",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start":"set PORT=8080 && node index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
index.js:
const http = require('http');
const server = http.createServer((req,res) => {
const data = {
'data': 'Hello World',
'hostname': require('os').hostname()
};
res.writeHead(200, {'Content-Type': 'application/json'})
res.end(JSON.stringify(data));
});
server.listen(process.env.PORT, (err) => {
if (err)
return console.log(err);
console.log('API is running on ' + process.env.PORT);
})
4条答案
按热度按时间ujv3wf0j1#
在windows docker上运行在vm中。所以当你使用
localhost:8082
时,你调用的是主机的localhost,也就是你的windows,而不是运行在不同ip上的docker vm。一种可以将localhost调用转发到运行docker的vm的方法是使用port forwarding
。我希望您已经安装了
virtualbox
。请按照以下步骤操作:打开虚拟框-〉在左侧栏选择虚拟机运行docker(这是命名为默认)-〉点击设置按钮上栏-〉选择网络-〉选择高级-〉选择端口转发。
在这里你可以输入rule将主机端口8082的请求转发到8080客户机端口,现在当你执行localhost:8082时,它会将请求转发到docker vm的8080,然后再转发到container 8080。
ibps3vxo2#
要访问Windows Docker主机上的站点,您需要使用容器的IP地址发出请求-这是仅对主机可见的虚拟IP地址(如果容器公开的端口与主机侦听外部请求的已发布端口不同,则还需要使用容器公开的端口):
参考-https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/
toe950273#
这似乎是由文件共享问题引起的。安装Docker时,文件共享服务似乎不起作用。Docker随后无法访问本地卷和文件共享。
这里有一篇文章详细介绍了如何让它工作。我会设置一个非常基本的节点应用程序,然后使用这些步骤来重现。
Dockerizing a node application
我能够得到我的基本节点应用程序使用下面的链接工作。
How to solve windows blocking sharing between host and docker containers
kh212irz4#
在我的例子中,问题出在容器内容的源代码上:在一个服务器类中,我配置了一个Rest API服务器在
127.0.0.1
的8080
端口上运行。就像@anujprashar的答案127.0.0.1
中解释的那样,127.0.0.1
是VM的localhost
。这可能不会自动绑定到(windows)机器的localhost
。在我将源代码更改为从
0.0.0.0
而不是127.0.0.1
运行服务器后,我可以从我的windows机器上使用http://localhost:8080/...
。(#停靠桌面、#Windows 11)