Docker 容器发布的端口无法访问?

Docker container published ports not accessible?

情况是这样的,我有一个用这个 dockerfile 构建的容器 运行ning:

FROM python:2-onbuild
EXPOSE 8888
CMD [ "nohup", "mock-server", "--dir=/usr/src/app", "&" ]

我运行它用这个命令:

 docker build -t mock_server .
 docker run -d -p 8888:8888 --name mocky mock_server

我在 mac 上使用它,所以 boot2docker 正在运行,我从 8888 上的 boot2docker ip 访问它。我尝试了 boot2docker ssh 并从那里访问容器。我 运行 docker exec -it mocky bashps aux 显示:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.9 113316 18576 ?        Ss   15:16   0:00 /usr/local/bin/python2 /usr/local/bin/mock-server --dir=/usr/src/app &
root         5  1.6  0.1  21916  3440 ?        Ss   17:52   0:00 bash
root         9  0.0  0.1  19180  2404 ?        R+   17:53   0:00 ps aux

当我卷曲它时:

curl -I -XGET localhost:8888/__manage
HTTP/1.1 200 OK
Content-Length: 183108
Set-Cookie: flash_msg_success=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Set-Cookie: flash_msg_error=; expires=Thu, 04 Sep 2014 17:54:58 GMT; Path=/
Server: TornadoServer/4.2.1
Etag: "efdb5b362491b8e4b8347b97ccafeca02db8d27d"
Date: Fri, 04 Sep 2015 17:54:58 GMT
Content-Type: text/html; charset=UTF-8

所以我的应用 运行 在容器内,但我无法从容器外获取任何东西。这里可以做什么?

第一个猜测是 python 程序明确绑定到不允许任何远程连接的环回 IP 地址 127.0.0.1。检查 python 模拟龙卷风服务器的文档,了解类似 --bind=0.0.0.0 的内容并相应地进行调整。

您可以通过执行 docker exec 并在容器 运行 netstat -ntlp | grep 8888 中查看绑定了哪个 IP 来确认是否属于这种情况。如果是 127.0.0.1,则确认确实是问题所在。

Docker 在 OS 之上运行,docker 机器有自己的 IP 地址。无法访问该端口的一个可能原因是您正在使用试图访问 127.0.0.1 的本地主机:但是您的 docker 机器可能是 运行 另一个 ip 地址,因此通过替换您的 curl 的 ip 地址应该可以。

$ docker-机器ip默认

这应该给你 docker 机器的 ip 地址,用 localhost 替换它。