使用 Docker Swarm 部署时,nginx 是否应该与 Django 打包到同一个容器中?

Should nginx be packed into the same container as Django when deploying with Docker Swarm?

我们正在寻求将我们当前的 Nginx/Gunicorn/Django 堆栈移动到 Docker,并使用 Docker Swarm 部署它以实现高可用性。我们一直在纠结的决定之一是是否将 Nginx 放在与 Gunicorn/Django 相同的容器中。以下是场景以及我们如何看待它们:

场景 1:将 Nginx 放入应用程序的容器中。这违反了 "each service has its own container" 方法,但它允许 Nginx 直接通过 unix 套接字而不是端口与 Gunicorn 通信。这显然不是很大,但值得一提。下面列出了主要优点。这里的一个潜在缺点是过多的 Nginx 实例会产生额外的开销(请权衡一下)。

场景二:将Nginx放在自己的容器中。尽管这遵循了上述方法,但似乎更有缺陷。在 Docker Swarm 场景中,Nginx 和 App 容器的分布可能会不均匀。一些节点可能最终有更多的 Nginx 容器,而其他节点有更多的应用程序容器(甚至可能是 0 个 Nginx 容器)。这意味着 Nginx 最终会在完全不同的主机上反向代理应用程序容器。

现在我确定 Docker Swarm 支持特殊配置,即每个节点上必须至少有一个 Nginx 容器 运行,但这让我觉得这是一种反模式。即使在那种情况下,是否值得为场景 1 付出努力?

根据生产经验,最好对应docker文档one container for one process中的规则。您正在运送一个带有 docker 图像的(微)服务,如果它需要在其中安装 nginx,您可以包含它。

所以基本上对于 django 应用程序有:

  1. nginx(例如:用于静态文件)
  2. gunicorn 或 uwsgi
  3. django 代码本身

在将 nginx 添加到容器时没有看到任何性能问题,但很少注意 docker 图像大小。在 ubuntu:16.04/debian:jessie 上,通过添加 nginx-full 可以将图像大小增加约 100mb。 (第一次拉取图像时有一些开销)。

所以这对第二种情况没有争议,因为您还可以在 docker 图像后面添加 nginx 以达到平衡目的(或 proxy_pass 管理)。