Docker 使用自定义网络代理

Docker proxy with custom networks

我正在设置一个 Docker 服务器,它必须托管多个需要通过 http (80) 访问的容器。我遵循了这个 tutorial 并且这个例子非常适合简单的情况。使用的代理映像是 jwilder/nginx-proxy,它会在设置或拆除容器时自动创建 Nginx 配置。

问题是 运行 在 Docker 服务器上的所有项目都使用自定义网络,这会破坏代理。

工作情况

当默认 bridge 网络上的代理 Web 服务器 运行 时,教程方法有效。然后代理完成他的工作并将流量重定向到正确的容器。

不工作的情况

大部分项目都是 Laravel 应用程序,由网络服务器、PHP FPM 和数据库组成。容器之间的通信是通过两个网络;服务器和数据库。

此设置不适用于桥接网络上的代理容器。所以我在 Docker 服务器上创建了一个名为 proxy (网桥)的新网络,并将代理和项目的 nginx 容器放在其中。代理服务器现在已成功更改配置以包含项目 (ip address:port)。但是当我尝试访问该域时,我会看到默认的 Nginx 欢迎页面。当项目容器关闭时,该页面仍然有效。当代理容器停止时,页面停止工作。 当我使用容器端口访问域时,该项目运行良好。

TL;DR;

当两个容器(代理 + 应用程序)都在桥接网络上时,代理工作正常。当容器位于自定义网络中时,代理会提供默认的 Nginx 欢迎页面(参见图片)。

如何使代理工作?

我尝试了什么?

我通过反复试验发现了问题。我在 Nginx 日志中发现了一个错误:

2017/06/14 14:40:27 Error running notify command: nginx -s reload, exit status 1

于是我查看了Nginx的配置,发现其中有一个my-default-domain.com的入口,在上游部分没有内容。这导致代理跳过重新加载配置命令,从而显示默认配置的 "Welcome!" 页面。

问题是我在代理容器的 docker-compose 中设置了环境变量 DEFAULTHOST: my-default-domain.com。所以代理容器搜索设置了环境变量 VIRTUAL_HOST=my-default-domain.com 的容器,找不到它导致上游部分为空。

我将默认容器放入 proxy 网络,它立即运行(或者只是删除默认主机环境变量)。