【问题标题】:How to send a request from inside a docker container to the outside hostname/port of this container?如何从 docker 容器内部向该容器的外部主机名/端口发送请求?
【发布时间】:2018-12-04 20:35:02
【问题描述】:

我有一个在 php:7.1.8-apache docker 容器中运行的 Web 应用程序。应用程序在容器内有端口80,在容器外有端口8080

应用程序的一部分向自身发送请求,但使用外部主机名/端口(例如发送至http://outsidehostname.local:8080)。

这不起作用,因为容器内不存在端口和主机名。

我已经尝试了--hostname 标志,但这并不能解决容器内外不同端口的问题。所以我正在寻找不同的解决方案。

主机名(outsidehostname.local)来自主机操作系统(在我的例子中是 macos)。我正在使用dnsmasq 将所有*.local 主机名解析为127.0.0.1

有什么方法可以配置 docker 以使这个请求在不改变应用程序行为的情况下工作?

【问题讨论】:

    标签: docker


    【解决方案1】:

    在 docker 中,您有各种选项来设置可以在容器之间解析的主机名:When to use --hostname in docker?

    这不起作用,因为容器内不存在端口和主机名。

    为什么不呢?这个外部主机名来自哪里?

    docker 无法解析的主机名可以由操作系统或网络级别上配置的其他 DNS 服务器解析。一般来说,如何解析主机名并不是一个简单的问题,您首先需要了解您的外部主机名是如何/在何处定义和解析的。

    更新:

    主机名(outsidehostname.local)来自主机操作系统(在我的例子中是 macos)。我正在使用 dnsmasq 将所有 *.local 主机名解析为 127.0.0.1

    这解释了您的问题:使用docker exec -it <containerId> /bin/sh 登录到您正在运行的容器(假设它是基于 Linux 的),然后在容器内部,如果您尝试查找 outsidehostname.local,您应该会看到 outsidehostname.local 无法解决,因为存在容器操作系统内没有这样的 DNS 信息。如果能解析到127.0.0.1,那你的下一个问题确实是端口不对。

    基本上在容器内运行网络服务器违背了在容器外运行您自己的 OSX DNS 解析器的目的。我对您的用例了解不多,无法真正提出一个好的解决方案,但对于基于 Linux 的图像,您始终可以编辑 /etc/hosts/etc/resolv.conf

    【讨论】:

    • 我已经尝试过--hostname 标志,但这并不能解决容器内外不同端口的问题。所以我正在寻找不同的解决方案。主机名来自主机操作系统(在我的例子中是 macos)。我正在使用dnsmasq 将所有*.local 主机名解析为127.0.0.1
    • 您能否将此信息添加到您的问题中,以便我可以在回复中添加答案,而不是在 cmets 中添加?但简而言之:端口不是问题,127.0.0.1 是。您需要解析为两个网络接口共享的 IP。
    • 我在原始问题中添加了我的评论。我有点理解你的简短回答,但我不知道如何实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2017-07-09
    • 1970-01-01
    相关资源
    最近更新 更多