我有一个在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,以便该请求能够在不更改应用程序行为的情况下工作?
答案 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
。