我已经拉取了一个 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
答案4
开始使用 docker,这是我遇到的第一个问题。
似乎 docker 允许您指定是否以不同的模式使用端口,例如 - 主机、网桥(默认)
在桥接模式下,docker 会在你部署 ghost 后向你显示一条消息 - 你的博客现在可以在http://本地主机:2368/但访问此网址显示连接被拒绝。
要解决此问题,您需要访问 kitematic 中的实例设置(比使用控制台更简单)。转到主机名/端口选项卡。创建一个如图所示的从 docker 端口到主机端口的映射,然后就大功告成了。现在再次访问该 url,一切都按预期工作。