2014-12-04 13 views
2

我有幾個Django,我想在運行CentOS的單個docker主機上託管。我想有3層如何設計Docker路由和數據庫層?

  • 網絡
  • 應用
  • 數據庫

網絡:我想在應用程序中的網絡層請求路由到不同的容器的nginx的容器層。我玩這個Docker容器中的1:1端口映射,將主機上的端口80暴露給容器。 Nginx的將使用直接請求適當的應用程序在應用程序層運行在端口8001-8010

應用:不適有幾個容器每個運行使用Gunicorn一個單獨Django應用程序上端口8001-8010

數據庫運行:一個容器爲每個應用程序運行MySQL並使用不同的數據庫。 MYSQL容器將有一個鏈接到它的數據卷用於持久性。

我知道你可以鏈接容器。但據我瞭解,我認爲它依賴於容器的啓動順序,即:如何在不啓動時將nginx鏈接到多個容器。

所以我的問題是

  1. 如何將網絡層連接到應用層時,在應用程序容器的編號/名稱在不斷變化。即:我可能會在線/離線帶來新的應用。我將如何更新nginx配置以及尋址是什麼樣子?

  2. 如何將應用程序層連接到數據庫層?我必須使用Docker鏈接嗎?在我的Django應用程序代碼中,我需要使用數據庫的主機名來連接。我會爲我的碼頭集裝箱的主機名放什麼?它能解決嗎?

  3. 有沒有我可以利用的參考架構?

回答

0

我結束了使用此解決方案:

https://github.com/blalor/docker-hosts

它可以讓你有通過主機名來指代其他容器的同一主機上。它也是動態的,因爲容器上下移動時,容器上的/ etc/host文件會動態更新。

0

Docker不支持動態鏈接,但有一些工具可以爲您做到這一點,請參閱此SO question

2.)您可以首先啓動數據庫容器,然後將所有應用程序容器鏈接到數據庫容器。 Docker將在啓動時創建主機文件(靜態地,如果您的數據庫容器重新啓動並獲得需要動態鏈接的另一個IP,請參見上文)。當你像這樣鏈接一個容器時:

-link db:db 

你可以訪問帶有主機名db的容器。

+0

感謝您提供的關於使用consul或etcd的鏈接。那些不工作在操作系統DNS名稱解析級別,雖然他們?即:我的nginx配置文件或我的django如何連接到一個端點而不重寫我的代碼? – CraigH 2014-12-05 02:21:22

+0

領事與etcd一起工作https://consul.io/intro/vs/index.html。 [Etcd](https://github.com/coreos/etcd)是一個分佈式密鑰存儲和Consule,SkyDNS等,在etcd之上構建一個DNS。根據以下聲明,AkyDNS應該可用於所有Docker Containr:「我們設置skydns以將其名稱服務器綁定到docker0橋,以便它可用於容器。」我不知道我的nginx可以處理這個,也許你最終會得到這些[hipache](https://github.com/hipache/hipache)或[vulcand](https://github.com/mailgun/vulcand)。 – 2014-12-05 07:53:25