2014-02-24 96 views
19

迄今爲止,我使用Mesos,Marathon和Docker管理一組服務器以及我放置的容器,取得了巨大成功。然而,我現在想進一步開始做一些事情,比如自動將haproxy容器鏈接到啓動的每個主要docker服務,或者提供其他基於守護進程和集裝箱化服務,這些服務僅與單個父容器鏈接並且可用。使用Mesos/Marathon鏈接的Docker容器

通常情況下,我會先用一些名字啓動幫助程序服務,然後當我開始真正的服務時,我會將它鏈接到幫助程序,一切都會好的。這個模型如何適合Marathon和Mesos?現在看來,至少集裝箱化是假設一個集裝箱。

我有一個想法,首先啓動幫助器服務,在任何可以找到的主機上,然後向真實服務添加一個約束,即hostname = helper服務的主機名,但似乎會導致資源提供問題和這些資源的競爭條件。

我也曾想過爲docker或啓動docker容器的執行程序腳本提供「嵌入」或「深層鏈接」功能。

在我走下任何這些路徑之前,我想知道是否有其他人解決了這個問題,或者如果我只是在思考問題。

謝謝!

回答

26

你在未知的領域中徘徊! ☺

這裏有多種方法;並沒有一個是完美的,但是由於編排鉤子,未來版本的Docker中情況會有所改善。

一種方法是使用良好的舊服務發現和註冊。 I.E.,當一項服務開始時,它將找出其公開可用的地址,並在例如Zookeeper,Etcd,甚至Redis。由於服務找出其公開可用的地址並不是微不足道的(除非您採用一些約定,例如總是映射端口X:X而不是讓Docker分配隨機端口),您可能需要從外部進行註冊。這意味着您的編排層(在這種情況下,Mesos)將啓動容器,然後找出主機和端口,並將其放入您的服務發現系統中。我對馬拉松不是很熟悉,但你應該能夠註冊一個鉤子。然後,其他容器只會在服務發現註冊表中查找端點地址,這很簡單。

您也可以看看Skydock,它會使用Skydns自動爲您的容器註冊DNS名稱。然而,它目前是單主機,所以如果你喜歡這個想法,你必須以某種方式擴展它來支持多個主機,也許還有SRV記錄。

另一種方法是使用「衆所周知的入口點」。這實際上是服務發現的簡化情況。這意味着您將確保您的服務始終在預先設置的主機和端口上運行,以便您可以靜態使用這些地址。當然,這是不好的(因爲當你想重現環境以進行測試/登臺時,它會讓你的生活更加艱難),但如果你對服務發現毫無頭緒,那麼它可能是一個開始。

您也可以使用Pipework創建跨越多個主機的一個(或多個)虛擬網絡,並將您的容器綁定在一起。管道工具可讓您手動分配IP地址,或通過DHCP自動分配IP地址。不過,建議不要使用此方法,但如果您還希望將容器插入現有網絡體系結構(例如VLAN ......),那麼該方法非常合適。

無論您決定使用哪種解決方案,我都強烈建議您「假裝」您正在使用鏈接。即而不是硬編碼您的應用配置以連接到(隨機示例)my-postgresql-db:5432,使用環境變量DB_PORT_5432_TCP_ADDRDB_PORT_5432_TCP_PORT(就像它是鏈接一樣),並在啓動容器時設置這些變量。這樣,如果您在沒有服務發現等情況下將容器「摺疊」到更簡單的環境中,則可以毫不費力地輕鬆回到鏈接上。

+2

所以對我來說很重要的一件事是容器的位置。我可以相對容易地找到其他容器的某種發現,但我正在尋找一種優化,超越了這種優化,迫使馬拉松在每個容器中啓動一組容器(認爲nginx + rails + credentials守護進程)。顯然我需要提交一個補丁,我應該看看Marathon而不是Docker嗎? –

+0

只是爲了確保我理解正確 - 你的意思是「......這迫使馬拉松在他們自己的主機中啓動一組容器(...)」?即強制容器在不同的主機上? – jpetazzo

+0

對不起,我希望組在單個主機上,例如附加到每個服務的本地haproxy。我認爲這裏的正確途徑是一個自定義的mesos執行器,它知道如何從馬拉松中獲取額外的參數,分叉自己,並管理兒童,確保如果任何一件死亡,整個組都會重新啓動。 –

相關問題