无法访问在 docker 中运行的服务

Posted

技术标签:

【中文标题】无法访问在 docker 中运行的服务【英文标题】:Can't access service running in docker 【发布时间】:2017-10-19 01:09:10 【问题描述】:

我无法通过在 docker 映像中运行的 http://localhost:8000 访问基于 nodejs 的服务。我正在使用 Docker for Mac (https://docs.docker.com/docker-for-mac/)

我正在关注这里的教程https://nodejs.org/en/docs/guides/nodejs-docker-webapp/。

服务器在 8000 端口上运行。我使用以下命令启动 docker 映像:

$ docker run -p 8000:8000 -d geuis/node-server:latest

如果我运行 docker ps 我会看到:

CONTAINER ID        IMAGE                      COMMAND             CREATED             STATUS              PORTS                    NAMES
9fa2e446918b        geuis/node-server:latest   "npm start"         6 seconds ago       Up 5 seconds        0.0.0.0:8000->8000/tcp   unruffled_lewin

如果我 docker exec -it 9fa2e446918b /bin/bash 可以访问 docker vm,我可以 curl http://localhost:8000 并从容器内部访问服务器。

但是,我从系统终端尝试相同的curl http://localhost:8000,但它无法访问。

不知道接下来我需要做什么。

【问题讨论】:

我用 docker for mac 试了一下,效果很好。除了端口还有其他修改吗? 你可以使用默认的 Docker IP 访问服务吗,即192.168.99.100:8000? (或任何其他 IP,如果您指定了默认值以外的 IP) 【参考方案1】:

试试下面的listen语句:

app.listen(PORT, '0.0.0.0');

通过阅读您提到的教程,看起来 express 正在收听 localhost。如果您在本地运行但在容器内部,这很好,localhost 与容器外部的localhost 不同。

0.0.0.0 是unspecified IPv4 address,因此 Express 将绑定它可以找到的任何 IP,这将是您的请求从容器外部进入的 IP。

【讨论】:

是的,就是这样。使用 hapijs 而不是 Express,但解决方案相同。

以上是关于无法访问在 docker 中运行的服务的主要内容,如果未能解决你的问题,请参考以下文章

运行 Docker 映像时无法访问 jarfile

应用服务中的 Docker 容器无法使用 Node SDK 访问 KeyVault

无法访问Docker Container的暴露端口

虚拟机中docker承载的微服务注册到nacos无法访问问题

虚拟机中docker承载的微服务注册到nacos无法访问问题

docker-compose java 无法访问 jarfile