尝试浏览映射到 Docker 容器的端口时获取“ERR_CONNECTION_REFUSED”

尝试浏览映射到 Docker 容器的端口时获取“ERR_CONNECTION_REFUSED”

我已经拉取了一个 Docker 镜像:

$ docker pull ghost

并从镜像中运行一个容器:

$ docker run --name test-ghost -p 8080:2368 -d ghost
7d984e974f6a75fe18b3d397b5c8f0a428928a2be9df83f0d61a679aa5f537fc

我的理解是,-p交换机会将主机上的端口(8080)映射到 Docker 内部的端口(2368),这样我就可以从 Docker 外部(即从我的主机)访问 Docker 内运行的 Web 服务器。

但是,当我尝试在 Chrome 中从我的主机浏览以下任何地址时:

http://localhost:8080/
http://0.0.0.0:8080/
http://127.0.0.1:8080/

我收到以下错误:

This webpage is not available

ERR_CONNECTION_REFUSED

这似乎是一个连接问题,而不是容器内部的问题,因为当我检查容器内正在运行的进程时,似乎 NodeJS 正在运行:

$ docker top test-ghost
UID          PID           PPID      ...  CMD
docker       4290          1028      ...  npm
docker       4324          4290      ...  sh -c node index
docker       4325          4324      ...  node index

但看起来 8080 端口上没有任何监听:

$ sudo lsof -n -i4TCP:8080 | grep LISTEN
$

我也检查过,我的 MacOS 防火墙已关闭。


我不指望在这里能找到完整的解决方案,因为我知道我提供的信息很少。

我想知道的是,如何才能解决这个问题?

看起来 Docker 端口无法访问。

有没有办法找出端口映射不起作用的原因?或者端口被 Docker 暴露了吗?也许我映射了错误的内部端口?

或者关于我在这里可能做错了什么还有其他一般性建议吗?

答案1

终于弄清楚如何让它工作了!

我在 MacOS 上运行 Docker 并使用“Docker QuickStart Terminal”。

事实证明,导航到“localhost”、“127.0.0.1”等是错误的,因为看起来 Docker 设置了自己的主机:

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/


docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

当我使用192.168.99.100上面给出的时,一切都运行正常。

答案2

要找出正在运行的容器的 IP 地址,可以使用:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' myContainerID

答案3

如果您运行 docker,docker-machine请使用以下命令获取 IP 地址(假设default是您的名字):

docker-machine ip default

看:https://docs.docker.com/machine/reference/ip/

答案4

开始使用 docker,这是我遇到的第一个问题。

似乎 docker 允许您指定是否以不同的模式使用端口,例如 - 主机、网桥(默认)

在桥接模式下,docker 会在你部署 ghost 后向你显示一条消息 - 你的博客现在可以在http://本地主机:2368/但访问此网址显示连接被拒绝。

要解决此问题,您需要访问 kitematic 中的实例设置(比使用控制台更简单)。转到主机名/端口选项卡。创建一个如图所示的从 docker 端口到主机端口的映射,然后就大功告成了。现在再次访问该 url,一切都按预期工作。

Kitematic 实例设置端口

相关内容