【问题标题】:How to subscribe to external API from docker container, without knowing host ip?如何在不知道主机 ip 的情况下从 docker 容器订阅外部 API?
【发布时间】:2018-07-26 14:28:31
【问题描述】:

我想从 docker 容器中订阅外部发布/订阅 API。对于订阅,我需要提供 IP 地址、端口和端点,当事件发生时,我的服务可以在这些端点上接收数据。

问题是从容器内部我不知道 docker 主机的 IP 地址,外部 API 必须向其发送数据。

我认为可以通过将主机 IP 作为环境变量传递给容器来解决该问题,但由于该服务必须安装在许多不同的主机上,我不想为每个主机手动设置环境变量。

任何帮助将不胜感激:)

【问题讨论】:

  • 请注意,您必须在许多环境中执行相同的操作,我只是将其作为环境变量传入。 (“我的笔记本电脑的 IP 地址是 192.168.1.2,但这不是可路由的 IP 地址。”“我的服务位于负载均衡器后面。”“所有入站流量都需要通过公司防火墙,然后由防火墙重新路由。” )
  • 也许一个选项是编写一个 shell 脚本,将 ip 地址放入环境变量并设置 docker compose 内容。这样就不需要手动设置,除了运行脚本。
  • 还可以考虑使用Docker Compose env_file: 块来提供环境变量以及 Compose 规范。
  • 感谢您输入@DavidMaze。所以我可以编写一个脚本,将主机的 ip 地址放入 docker env_file 中。然后我可以使用这个环境变量为每个主机注册到 API。

标签: docker environment-variables publish-subscribe


【解决方案1】:

我终于通过添加在主机网络上运行该服务

network_mode: host

到我在 docker-compose.yml 中的服务

这样 docker 容器会在 hosts 网络中获得一个 ip 地址,所以它只需使用自己的 ip 地址注册到外部 API。

请注意,此解决方案不适用于 OS X 或 Windows,因为 docker 在这些操作系统的虚拟服务器上运行。

我在 java 中检索我的服务的 IP 地址,如下所示。

public static InetAddress getCurrentIp() {
    try {
        Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
        while (networkInterfaces.hasMoreElements()) {
            NetworkInterface ni = networkInterfaces.nextElement();
            Enumeration<InetAddress> nias = ni.getInetAddresses();
            while(nias.hasMoreElements()) {
                InetAddress ia= nias.nextElement();
                if (!ia.isLinkLocalAddress() 
                        && !ia.isLoopbackAddress()
                        && ia instanceof Inet4Address) {
                    return ia;
                }
            }
        }
    } catch (SocketException e) {
        LOG.error("unable to get current IP " + e.getMessage(), e);
    }
    return null;
}

【讨论】:

    猜你喜欢
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2019-05-28
    • 2018-02-17
    • 2022-08-22
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多