Django 如何使用带有docker的nginx作为反向代理

Django 如何使用带有docker的nginx作为反向代理,django,nginx,proxy,docker,Django,Nginx,Proxy,Docker,我有一个django应用程序,并在localhost:8000上使用gunicorn运行它 我已经为nginx配置了将其用作反向代理的功能 upstream django { # fail_timeout=0 means we always retry an upstream even if it failed # to return a good HTTP response (in case the Unicorn master nukes a # single worke

我有一个django应用程序,并在localhost:8000上使用gunicorn运行它 我已经为nginx配置了将其用作反向代理的功能

    upstream django {
 #  fail_timeout=0 means we always retry an upstream even if it failed
 #  to return a good HTTP response (in case the Unicorn master nukes a
 #  single worker for timing out).

  server localhost:8000 fail_timeout=0;
}

我知道如何公开80端口并在容器中运行nginx,但我不知道如何连接本地主机上运行的gunicorn和容器中的nginx。

您需要利用docker创建的网桥的IP。Docker上有一篇很好的文章解释了这一点:
    upstream django {
 #  fail_timeout=0 means we always retry an upstream even if it failed
 #  to return a good HTTP response (in case the Unicorn master nukes a
 #  single worker for timing out).

  server IP_OF_DOCKER0:8000 fail_timeout=0;
}

当Docker启动时,它会在上创建一个名为docker0的虚拟接口 主机。它随机选择一个地址和子网 RFC 1918定义的在主机上未使用的专用范围 机器,并将其分配给docker0

如果我们查看分配给docker 0的IP地址(
sudo IP addr show docker 0
),我们可以将其用作IP地址,从docker容器中与主机通信

    upstream django {
 #  fail_timeout=0 means we always retry an upstream even if it failed
 #  to return a good HTTP response (in case the Unicorn master nukes a
 #  single worker for timing out).

  server IP_OF_DOCKER0:8000 fail_timeout=0;
}
我还没有测试过上面的内容,但我相信它应该会起作用。如果没有,您可能还需要将gunicorn绑定到docker0 IP

这个答案对这个过程也有很好的了解。。。
更好的方法可能是将django应用程序也“dokerize”,构建一个 dokerized nginx和Dockized django应用程序之间的网络 然后将http端口从停靠的nginx公开到所有接口


这是一个很好的例子,也许你可以从中得到一些提示:)

虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。