?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
要在 Docker Engine 處于群集模式時(shí)部署應(yīng)用程序映像,請(qǐng)創(chuàng)建一個(gè)服務(wù)。在某些更大的應(yīng)用程序中,服務(wù)通常會(huì)成為微服務(wù)的圖像。服務(wù)示例可能包括 HTTP 服務(wù)器,數(shù)據(jù)庫(kù)或您希望在分布式環(huán)境中運(yùn)行的任何其他類型的可執(zhí)行程序。
在創(chuàng)建服務(wù)時(shí),您可以指定要使用哪個(gè)容器映像以及要在正在運(yùn)行的容器中執(zhí)行哪些命令。您還可以定義該服務(wù)的選項(xiàng),包括:
群體將在群體外提供服務(wù)的端口
該服務(wù)的覆蓋網(wǎng)絡(luò)連接到群中的其他服務(wù)
CPU和內(nèi)存限制和保留
滾動(dòng)更新政策
要在群中運(yùn)行的圖像副本的數(shù)量
將服務(wù)部署到群集時(shí),群集管理器接受服務(wù)定義作為服務(wù)的所需狀態(tài)。然后它將該群中的節(jié)點(diǎn)上的服務(wù)作為一個(gè)或多個(gè)副本任務(wù)進(jìn)行調(diào)度。這些任務(wù)在群中的節(jié)點(diǎn)上彼此獨(dú)立運(yùn)行。
例如,假設(shè)您想要在 HTTP 偵聽(tīng)器的三個(gè)實(shí)例之間進(jìn)行負(fù)載平衡。下圖顯示了具有三個(gè)副本的 HTTP 偵聽(tīng)器服務(wù)。監(jiān)聽(tīng)者的三個(gè)實(shí)例中的每一個(gè)都是群中的一個(gè)任務(wù)。
容器是一個(gè)孤立的過(guò)程。在群模式模型中,每個(gè)任務(wù)只調(diào)用一個(gè)容器。任務(wù)類似于調(diào)度程序放置容器的“插槽”。一旦容器處于活動(dòng)狀態(tài),調(diào)度程序就會(huì)識(shí)別出該任務(wù)處于運(yùn)行狀態(tài)。如果容器未通過(guò)健康檢查或終止,則任務(wù)將終止。
任務(wù)是群體中的調(diào)度的原子單位。當(dāng)您通過(guò)創(chuàng)建或更新服務(wù)來(lái)聲明所需的服務(wù)狀態(tài)時(shí),協(xié)調(diào)器通過(guò)調(diào)度任務(wù)來(lái)實(shí)現(xiàn)所需的狀態(tài)。例如,您可以定義一個(gè)服務(wù),指示協(xié)調(diào)器始終保持運(yùn)行 HTTP 偵聽(tīng)器的三個(gè)實(shí)例。協(xié)調(diào)者通過(guò)創(chuàng)建三個(gè)任務(wù)來(lái)做出響應(yīng)。每個(gè)任務(wù)都是調(diào)度程序通過(guò)產(chǎn)生容器來(lái)填充的插槽。容器是任務(wù)的實(shí)例化。如果 HTTP 偵聽(tīng)程序任務(wù)隨后失敗其運(yùn)行狀況檢查或崩潰,則該協(xié)調(diào)器會(huì)創(chuàng)建一個(gè)新的副本任務(wù),以生成一個(gè)新的容器。
任務(wù)是一個(gè)單向機(jī)制。它通過(guò)一系列狀態(tài)單調(diào)進(jìn)行:分配,準(zhǔn)備,運(yùn)行等。如果任務(wù)失敗,則協(xié)調(diào)器刪除任務(wù)及其容器,然后創(chuàng)建一個(gè)新任務(wù)以根據(jù)服務(wù)指定的期望狀態(tài)進(jìn)行替換。
Docker 群集模式的基礎(chǔ)邏輯是通用調(diào)度器和協(xié)調(diào)器。服務(wù)和任務(wù)抽象本身并不知道它們實(shí)現(xiàn)的容器。假設(shè)你可以實(shí)現(xiàn)其他類型的任務(wù),例如虛擬機(jī)任務(wù)或非集裝箱化的任務(wù)。調(diào)度程序和協(xié)調(diào)器對(duì)于任務(wù)的類型是不可知的。但是,當(dāng)前版本的 Docker 僅支持容器任務(wù)。
下圖顯示了 swarm 模式如何接受服務(wù)創(chuàng)建請(qǐng)求并為工作節(jié)點(diǎn)調(diào)度任務(wù)。
服務(wù)可以被配置為使得群中當(dāng)前沒(méi)有節(jié)點(diǎn)可以運(yùn)行其任務(wù)。在這種情況下,服務(wù)保持在狀態(tài)pending
。以下是一些服務(wù)可能保持在狀態(tài)的幾個(gè)示例pending
。
注意:如果您的唯一目的是阻止部署服務(wù),請(qǐng)將服務(wù)擴(kuò)展為0而不是嘗試將其配置為保留在服務(wù)中pending
。
如果所有節(jié)點(diǎn)都處于暫?;蚝谋M狀態(tài),并且您創(chuàng)建了一個(gè)服務(wù),它將處于等待狀態(tài),直到某個(gè)節(jié)點(diǎn)可用。實(shí)際上,第一個(gè)可用的節(jié)點(diǎn)將獲得所有的任務(wù),因此在生產(chǎn)環(huán)境中這不是一件好事。
您可以為服務(wù)保留特定數(shù)量的內(nèi)存。如果群中沒(méi)有節(jié)點(diǎn)具有所需的內(nèi)存量,則該服務(wù)將保持等待狀態(tài),直到有可用節(jié)點(diǎn)運(yùn)行其任務(wù)。如果你指定一個(gè)非常大的值,比如500 GB,那么這個(gè)任務(wù)將永遠(yuǎn)處于等待狀態(tài),除非你真的有一個(gè)可以滿足它的節(jié)點(diǎn)。
您可以對(duì)服務(wù)實(shí)施布局約束,并且在給定的時(shí)間內(nèi)約束可能無(wú)法得到遵守。此行為說(shuō)明您的任務(wù)的要求和配置與群體的當(dāng)前狀態(tài)并不緊密相關(guān)。作為群體的管理員,您聲明群體的期望狀態(tài),并且經(jīng)理與群體中的節(jié)點(diǎn)一起工作以創(chuàng)建該狀態(tài)。您不需要微管理群集上的任務(wù)。復(fù)制和全局服務(wù)有兩種類型的服務(wù)部署,即復(fù)制和全局。對(duì)于復(fù)制服務(wù),指定要運(yùn)行的相同任務(wù)的數(shù)量。例如,您決定部署一個(gè)具有三個(gè)副本的HTTP服務(wù),每個(gè)副本服務(wù)于相同的內(nèi)容。全局服務(wù)是在每個(gè)節(jié)點(diǎn)上運(yùn)行一項(xiàng)任務(wù)的服務(wù)。沒(méi)有預(yù)先指定的任務(wù)數(shù)量。每次將節(jié)點(diǎn)添加到swarm中時(shí),編排器都將創(chuàng)建一個(gè)任務(wù),并且調(diào)度程序?qū)⒃撊蝿?wù)分配給新節(jié)點(diǎn)。全球服務(wù)的良好候選者是監(jiān)控代理,要在群集中的每個(gè)節(jié)點(diǎn)上運(yùn)行的防病毒掃描程序或其他類型的容器。下圖顯示了三個(gè)服務(wù)的黃色副本和灰色的全局服務(wù)。
了解更多
了解群集模式節(jié)點(diǎn)如何工作。
了解PKI如何在群集模式下工作。