如何从docker容器内部向该容器的外部主机名/端口发送请求?

时间:2018-12-04 20:35:03

标签: docker

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

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

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

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

主机名(outsidehostname.local)来自主机os(在我的情况下是macos)。我正在使用dnsmasq将所有*.local主机名解析为127.0.0.1

有什么方法可以配置docker,以便该请求能够在不更改应用程序行为的情况下工作?

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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

更新:

  

主机名(outsidehostname.local)来自主机os(在我的情况下是macos)。我正在使用dnsmasq将所有*.local主机名解析为127.0.0.1

这说明了您的问题:使用docker exec -it <containerId> /bin/sh登录到正在运行的容器(假设它是基于Linux的),然后在容器中尝试查找outsidehostname.local时,应该看到outsidehostname.local无法解决,因为容器OS内没有此类DNS信息。如果可以解决为127.0.0.1,那么您的下一个问题确实是端口错误。

基本上在容器内运行Web服务器将无法在容器外运行自己的OSX DNS解析器。对于您的用例,我还不太了解,不能真正提出一个好的解决方案,但是对于基于Linux的映像,您可以随时编辑/etc/hosts/etc/resolv.conf