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 欢迎页面(参见图片)。
如何使代理工作?
我尝试了什么?
- 从代理 Ping 到项目 成功
- 在代理上使用 curl 到项目来检查网页是否正常工作成功
- 已检查代理的 Nginx 配置文件是否缺少详细信息。 None 项目容器的IP地址加上端口号是正确的。文件条目与示例的条目相同。
我通过反复试验发现了问题。我在 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
网络,它立即运行(或者只是删除默认主机环境变量)。
我正在设置一个 Docker 服务器,它必须托管多个需要通过 http (80) 访问的容器。我遵循了这个 tutorial 并且这个例子非常适合简单的情况。使用的代理映像是 jwilder/nginx-proxy
,它会在设置或拆除容器时自动创建 Nginx 配置。
问题是 运行 在 Docker 服务器上的所有项目都使用自定义网络,这会破坏代理。
工作情况
当默认 bridge
网络上的代理 和 Web 服务器 运行 时,教程方法有效。然后代理完成他的工作并将流量重定向到正确的容器。
不工作的情况
大部分项目都是 Laravel 应用程序,由网络服务器、PHP FPM 和数据库组成。容器之间的通信是通过两个网络;服务器和数据库。
此设置不适用于桥接网络上的代理容器。所以我在 Docker 服务器上创建了一个名为 proxy (网桥)的新网络,并将代理和项目的 nginx 容器放在其中。代理服务器现在已成功更改配置以包含项目 (ip address:port)。但是当我尝试访问该域时,我会看到默认的 Nginx 欢迎页面。当项目容器关闭时,该页面仍然有效。当代理容器停止时,页面停止工作。
当我使用容器端口访问域时,该项目运行良好。
TL;DR;
当两个容器(代理 + 应用程序)都在桥接网络上时,代理工作正常。当容器位于自定义网络中时,代理会提供默认的 Nginx 欢迎页面(参见图片)。
如何使代理工作?
我尝试了什么?
- 从代理 Ping 到项目 成功
- 在代理上使用 curl 到项目来检查网页是否正常工作成功
- 已检查代理的 Nginx 配置文件是否缺少详细信息。 None 项目容器的IP地址加上端口号是正确的。文件条目与示例的条目相同。
我通过反复试验发现了问题。我在 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
网络,它立即运行(或者只是删除默认主机环境变量)。