【问题标题】:Docker container published ports not accessible?Docker 容器发布的端口无法访问?
【发布时间】:2015-09-04 17:58:02
【问题描述】:

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

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

所以我的应用程序在容器内运行,但我无法从它外面得到任何东西。在这里可以做什么?

【问题讨论】:

  • 旁白:在你的 Dockerfile CMD 行中不需要nohup
  • @PeterLyons 如果我不做类似nohup 的操作,服务器模拟服务器似乎没有运行。
  • 啊,如果 stdin 不是 tty 或其他东西,它可能会退出,它可能不应该这样做。但对于大多数合适的网络服务器来说,仅供参考,nohup 不是必需的,也不应该在 docker CMD 行中使用。

标签: docker containers


【解决方案1】:

首先猜测是 python 程序显式绑定到环回 IP 地址127.0.0.1,它不允许任何远程连接。检查该 python 模拟龙卷风服务器的文档以获取类似 --bind=0.0.0.0 的内容并进行相应调整。

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

【讨论】:

  • 谢谢,我刚刚想通了,发现您给出了类似的答案。我没有意识到您不能在本地主机或环回地址上的容器内提供服务。专门针对这个问题,我将 Dockerfile CMD 更改为:CMD [ "nohup", "mock-server", "--dir=/usr/src/app", "--address=0.0.0.0", "&" ]
  • 谢谢彼得,@peter-lyons 终于关注了这个我在使用 docker 运行 sinatra 应用程序时遇到了同样的问题 .. 赞成 :-)
【解决方案2】:

Docker 在操作系统之上运行,并且 docker 机器有自己的 IP 地址。端口无法访问的一个可能原因是您正在使用 localhost 尝试访问 127.0.0.1:但您的 docker 机器可能正在运行另一个 IP 地址,因此通过替换您的 curl 应该可以工作的 IP 地址。

$ docker-machine ip 默认

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

【讨论】:

  • 这是给我的!如果你在 OSX 上运行,你必须使用 docker-machine,所以你可能会看到这个。无论您运行什么客户端,都必须指定主机名和端口。例如 postgres 将是 psql -h 192.168.99.100 -p 5433 -U postgres(将主机名替换为 docker-machine ip default 返回的任何内容
猜你喜欢
  • 2021-02-03
  • 1970-01-01
  • 2016-12-06
  • 2018-05-09
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多