无法通过Windows本地主机访问Docker容器

ruarlubt  于 2022-12-29  发布在  Docker
关注(0)|答案(4)|浏览(472)

我似乎无法访问任何正在运行的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);
})
ujv3wf0j

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。

ibps3vxo

ibps3vxo2#

要访问Windows Docker主机上的站点,您需要使用容器的IP地址发出请求-这是仅对主机可见的虚拟IP地址(如果容器公开的端口与主机侦听外部请求的已发布端口不同,则还需要使用容器公开的端口):
参考-https://blog.sixeyed.com/published-ports-on-windows-containers-dont-do-loopback/

toe95027

toe950273#

这似乎是由文件共享问题引起的。安装Docker时,文件共享服务似乎不起作用。Docker随后无法访问本地卷和文件共享。
这里有一篇文章详细介绍了如何让它工作。我会设置一个非常基本的节点应用程序,然后使用这些步骤来重现。
Dockerizing a node application
我能够得到我的基本节点应用程序使用下面的链接工作。
How to solve windows blocking sharing between host and docker containers

kh212irz

kh212irz4#

在我的例子中,问题出在容器内容的源代码上:在一个服务器类中,我配置了一个Rest API服务器在127.0.0.18080端口上运行。就像@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)

相关问题