2016-11-29 11 views
4

我們希望將我們當前的Nginx/Gunicorn/Django堆棧移到Docker中,並使用Docker Swarm將其部署爲高可用性。我們一直在努力的決定之一是是否將Nginx放在與Gunicorn/Django相同的容器中。以下是場景以及我們如何查看它們:在使用Docker Swarm進行部署時,nginx是否應該與Django一起打包到同一個容器中?

場景1:將Nginx放置在應用程序的容器中。這違背了「每個服務都有自己的容器」的方法,但它允許Nginx通過unix套接字而不是端口直接與Gunicorn進行通信。這顯然不是很大,但值得一提。主要優點如下所列。這裏一個潛在的缺點是有太多的Nginx實例需要額外的開銷(請注意這一點)。

場景2:將Nginx放置在自己的容器中。雖然這遵循上述方法論,但它似乎更加有缺陷。在Docker Swarm場景中,Nginx和App容器的分佈可能不統一。一些節點最終可能會有更多的Nginx容器,而另一些節點可能有更多的應用容器(甚至可能還有Nginx容器)。這意味着Nginx將最終完全反向代理不同主機上的應用容器。

現在我確信Docker Swarm支持特殊的配置,至少有一個Nginx容器必須在每個節點上運行,但這會讓我覺得它是一種反模式。即使在這種情況下,情景1的努力是否值得?

+0

你的nginx實例的目的只是將代理傳遞給gunicorn?如果是這樣,與@ vanadium23的觀點相反,在我看來,有n個nginx實例是一個反模式,其中只有一個實例(或3個,用於HA目的)就足夠了。 注意:我對Gunicorn/Django堆棧並不熟悉,但我一直在依靠docker – MagicMicky

+0

@MagicMicky管理/運行一個完整的微服務堆棧,提出了一個有趣的觀點。你是否配置swarm在每個worker上運行一個Nginx實例? –

+0

我們實際上有2個專門的前端服務器,它們將Nginx和proxypass運行到我們的swarm管理器(然後轉發到所需的應用程序)。這可能會帶來一點開銷,但在自己的服務器上管理我們的nginx會更容易。如果你想堅持使用docker swarms,我會在3個實例中啓動Nginx,並使用[Docker Swarm負載均衡器](https://docs.docker.com/engine/swarm/key-concepts/#/load-balancing )在差異實例之間進行負載平衡。 – MagicMicky

回答

4

根據生產經驗,最好是碼頭文檔one container for one process的配對規則。您正在使用Docker鏡像發送(微)服務,並且如果需要在其中包含nginx,請將其包含在內。

所以基本上Django的應用有:

  1. nginx的(如:對靜態文件)
  2. gunicorn或uwsgi
  3. Django的代碼本身

看不到任何性能比較關於將nginx添加到容器的問題,但對泊塢窗圖像大小的一點注意。在ubuntu上:16.04/debian:jessie通過添加nginx-full將圖像大小增加約100MB。 (在第一張圖片上有一些開銷)。

因此,對於第二種情況並不存在爭議,因爲您也可以在docker映像後面添加nginx以實現平衡目的(或proxy_pass管理)。

相關問題