【问题标题】:docker-machine: Can't access container's web server from hostdocker-machine:无法从主机访问容器的 Web 服务器
【发布时间】:2016-07-18 16:30:33
【问题描述】:

我刚刚使用自制软件在我的 Mac 上安装了带有 Docker-Toolbox 的 Docker:install docker with homebrew

在使用 Rails、Postgres 和启动 docker-compose 创建和配置容器后,一切看起来都很好,但我无法从主机访问网络服务器。

输出

$ docker-compose up

dummy_1    | I, [2016-03-30T14:55:53.130639 #6]  INFO -- : listening on addr=0.0.0.0:8000 fd=10

当我在谷歌浏览器中输入 url http://0.0.0.0:8000/ 我得到

This site can’t be reached

0.0.0.0 refused to connect.
ERR_CONNECTION_REFUSED

所以我尝试了

$ docker-machine env dummy

输出如下:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/choi/.docker/machine/machines/dummy"
export DOCKER_MACHINE_NAME="dummy"

当我在 Chrome http://192.168.99.100:2376 中尝试时,我下载了一个空白文件。为什么会这样?我希望我的 Rails 应用程序的默认问候页面。

【问题讨论】:

标签: docker


【解决方案1】:

192.168.99.100 是您的 Docker 主机的 IP,在此实例中。您需要公开容器的端口,然后您就可以从外部连接到它。

我不熟悉 Docker Compose,但是您发布的日志 suggests 端口 8000 已暴露。因此,请尝试http://192.168.99.100:8000

http://192.168.99.100:2376 不起作用的原因是因为这是 Docker 守护进程本身的地址和端口,它不是基于 HTTP 的。至于 0.0.0.0:这是您的 Web 服务器正在侦听的地址在容器内部上,并等同于其中的所有外部连接。但是,如果没有任何端口暴露,就无法进入!)

【讨论】:

  • 特别感谢您指出容器需要通过机器的 IP 访问。我认为它应该是localhost,但似乎在机器的上下文中一切都通过它......
  • 我在 Win10 Home 上遇到了一个问题,其中 : 不允许我访问正在侦听容器内 localhost:8080 的应用服务器,其中容器中的 8080 映射到我的主机上的 3000 。 (0.0.0.0:8080->3000/tcp) 仍在寻找根本原因。
  • 花了我一些时间,但最终找到了这个答案!谢谢
  • 我这样做了,但仍然无法从浏览器访问它。它确实通过 curl 正确返回。对此有什么想法吗?
【解决方案2】:

对于那些尝试localhost:4000the tutorial 所说但失败的人:

输入这个:

$ docker-machine env

你会看到类似的东西:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/choi/.docker/machine/machines/dummy"
export DOCKER_MACHINE_NAME="dummy"

所以你得到了 IP:192.168.99.100。然后只需访问192.168.99.100:4000,就像ip:your_port

【讨论】:

  • 我只是得到错误:没有指定机器名称并且不存在“默认”机器
  • @Geordie 你需要安装 docker 工具箱才能工作
【解决方案3】:

您可以通过这种方式找到合适的地址来调用您的页面 首先,通过以下方式找到 CONTAINER ID:

$ docker ps

你会得到这样的信息:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                          NAMES
56dd4d582b08        abc01               "python app.py"     10 minutes ago      Up 11 minutes       80/tcp, 0.0.0.0:80->4000/tcp   flamboyant_bell

现在您知道端口了:4000(向右滚动此行)。所以地址应该是这样的:

http://192.168.99.100:4000/

但是,您可以仔细检查:

$ docker port 56dd4d582b08

在这种情况下,您将获得以下信息:

4000/tcp -> 0.0.0.0:80

现在您可以尝试查看您的项目

http://192.168.99.100:4000/

【讨论】:

  • 你从哪里得到的 IP 地址?
  • 与@surfer190 相同的问题
  • 嗨@mirana,如果您从“CONTAINER ID”开始的行向右滚动,您会看到。请通知,如果它解决了你的问题
  • IP 地址是运行 Docker 的主机的 LAN IP 地址 - 它在问题中提供。 docker ps 的输出只提供 0.0.0.0
  • @Mattygabe 如果没有显示 IP 而您只看到端口怎么办?
【解决方案4】:

暴露端口后,您可以通过docker创建的内部IP地址访问Web应用程序。您可以使用运行命令的容器名称获取 IP 地址:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' 'container name here'

假设您获得了 IP 172.17.0.2。你可以运行open http://172.17.0.2:8000

【讨论】:

  • 这行不通,因为他正在使用 docker 机器运行 docker。您在 docker 机器中创建的容器可以通过主机地址访问,而不是直接访问。
  • 你是对的,@willa。但在旧版本中,在添加路由为sudo route -n add 172.17.0.0/16 $(docker-machine ip dev) 后,可以访问容器的私有 IP。
  • @GustavoHenrique 我正在使用 Docker Desktop for windows,我想运行 httpd 映像,但不能通过浏览器! ip地址是172.17.0.2:<port>还是不能访问!
【解决方案5】:

虽然这个解决方案似乎确实有效,但对我来说它为什么以这种方式工作并没有多大意义。来自环境的 ip 地址甚至不在我的网络上(并且与我的 ip v4 静态 ip 地址或 localhost 环回地址 127.0.0.1 不匹配);

$ docker-machine env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376" 

标准(apache、jetty、tomcat等)是转发到localhost(127.0.0.1),为什么docker不这样做呢?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多