我正在设置一个Docker服务器,它必须托管多个需要通过http(80)访问的容器。我已经遵循了这个tutorial,这个例子适用于简单的情况。使用的代理映像是jwilder/nginx-proxy
,可以在设置或拆除容器时自动创建Nginx配置。
问题是将在Docker服务器上运行的所有项目都使用破坏代理的自定义网络。
当代理和 Web服务器在默认的bridge
网络上运行时,教程方式有效。然后代理完成他的工作并将流量重定向到正确的容器。
大多数项目都是Laravel应用程序,由Web服务器,PHP FPM和数据库组成。容器之间的通信是通过两个网络进行的;服务器和数据库。
此设置不适用于桥接网络上的代理容器。所以我在Docker服务器上创建了一个名为 proxy (bridge)的新网络,并在其中放置了代理和项目的nginx容器。代理服务器现在成功更改为配置以包含项目(IP地址:端口)。但是当我尝试访问域时,我得到了默认的Nginx欢迎页面。项目容器关闭时页面仍然有效。代理容器停止时页面停止工作。 当我使用容器端口访问域时,项目工作正常。
当两个容器(代理+应用程序)都在桥接网络上时,代理工作正常。当容器位于自定义网络中时,代理会提供默认的Nginx欢迎页面(请参阅图像)。
如何让代理工作?
答案 0 :(得分:0)
我通过反复试验找到了问题。我监督了Nginx日志中的错误:
2017/06/14 14:40:27 Error running notify command: nginx -s reload, exit status 1
所以我调查了Nginx配置,发现其中有一个my-default-domain.com
条目,上游部分没有内容。这导致代理跳过reload config命令,从而显示默认配置的“Welcome!”页。
问题是我在代理容器的DEFAULTHOST: my-default-domain.com
中设置了环境变量docker-compose
。因此,代理容器搜索了设置了环境变量VIRTUAL_HOST=my-default-domain.com
的容器,但无法找到它导致空的上游部分。
我将默认容器放入proxy
网络并立即工作(或者只删除默认的主机环境变量)。