簡體   English   中英

何時使用 Docker-Compose 何時使用 Docker-Swarm

[英]When to use Docker-Compose and when to use Docker-Swarm

我試圖了解Docker-ComposeDocker-Swarm之間的差異或相似之處。

通過閱讀文檔,我了解到 docker-compose 提供了一種將不同容器綁定在一起並作為單個服務協同工作的機制(我猜它使用與用於鏈接兩個容器的--link命令相同的功能)

此外,我對 docker-swarm 的理解是,它允許您管理不同docker-hosts的集群,每個集群都運行一些 docker-images 的多個容器實例。 我們可以將連接定義為 swarm 中不同容器之間的覆蓋網絡(即使它們跨越 swarm 中的兩個 docker-hosts)以將它們連接為一個單元。

我想了解的是 docker-swarm 是否成功了 docker-compose 和覆蓋網絡是連接容器的新(推薦)方式?

還是說 docker-compose 仍然是整個 docker 家族中不可或缺的一部分,使用它來連接容器以進行協作是預期和可取的。 如果是這樣,docker-compose 是否可以與集群中不同節點的容器一起使用?

還是覆蓋網絡用於連接群中不同主機之間的容器,而 docker-compose 用於創建內部鏈接?

此外,我還看到docker文檔中提到--links不再推薦並且很快就會過時。

我有點糊塗???

多謝!

從一些定義開始可能會有所幫助:

  • docker-compose :用於配置和管理一組相關容器的命令。 它是 docker cli 使用的相同 api 的前端,因此您可以使用docker run類的命令重現它的行為。
  • docker-compose.yml :一組容器的定義文件,由 docker-compose 使用,現在也由 swarm 模式使用。
  • swarm 模式:用於將一組 docker 引擎作為單個實體進行管理並提供編排(不斷嘗試糾正當前狀態和目標狀態之間的任何差異)。
  • service : swarm 中相同鏡像和配置的一個或多個容器,多個容器提供可擴展性。
  • stack :swarm 中的一個或多個服務,可以使用 DAB 或 docker-compose.yml 文件定義這些服務。
  • 橋接網絡:由單個 docker 引擎管理的網絡,其中多個容器可以相互通信。 您可能有多個由引擎管理的網絡,並且容器可以連接到零個或多個網絡。
  • 覆蓋網絡:類似於橋接網絡,但跨越多個 docker 引擎。 這些需要一個鍵/值存儲來維護它們的狀態。 Swarm 模式提供了這一點,但如果禁用了 swarm 模式,您也可以使用 etcd、consul 或 zookeeper。
  • links :一種在橋接網絡之前將容器連接在一起的方法。 不再推薦其使用。
  • 經典 swarm :作為容器運行的集成 swarm 模式的前身,允許多個引擎顯示為一個,但不提供編排或包含自己的 k/v 存儲。

回答問題:

docker-swarm 是否成功了 docker-compose 和覆蓋網絡是連接容器的新(推薦)方式嗎?

還是說 docker-compose 仍然是整個 docker 家族中不可或缺的一部分,使用它來連接容器以進行協作是預期和可取的。 如果是這樣,docker-compose 是否可以與集群中不同節點的容器一起使用?

它們提供不同的功能,並將繼續為一個目的服務。 docker-compose 無法在 swarm 模式下啟動容器,但是可以使用較新版本的 docker-compose.yml 文件(版本 3)直接在 swarm 模式下定義堆棧,而無需使用 docker-compose 本身。 需要 docker-compose 在 swarm 模式之外、在單個 docker 引擎上或使用經典 swarm 來管理容器。

還是覆蓋網絡用於連接群中不同主機之間的容器,而 docker-compose 用於創建內部鏈接?

此外,我還看到 docker 文檔中提到 --links 不再推薦並且很快就會過時。

docker-compose 從 yml 文件的第 2 版開始,默認情況下將多個容器連接在一起,每個項目都有一個新的橋接網絡(項目默認為目錄名稱)。 使用經典 swarm,這將默認為使用外部 k/v 存儲的覆蓋網絡。 使用群模式堆棧,這將是一個覆蓋網絡。

使用 docker 網絡是讓容器相互通信的首選方式。 您希望每組容器都有一個網絡,您希望將其與 docker 環境的其余部分隔離。 docker-compose 自動創建此網絡,但您也可以使用docker networks create從命令行執行此操作。

鏈接已在很大程度上被具有內置 DNS 發現的 docker 網絡所取代。 當您從 docker-compose.yml 中刪除鏈接時,您可能需要將它們替換為depends_on部分以強制執行容器啟動順序。 否則,鏈接有意義的場景很少,我看到的所有用法都來自遵循過時文檔的人。

組合或群或群覆蓋網絡

如果您在筆記本電腦等上進行演示以外的任何其他操作,您會發現需要使用上述所有內容。

我特意將 swarm 和 swarm 覆蓋網絡分開,因為您不需要同時使用兩者,但是如果沒有 swarm 在它下面,您就無法獲得覆蓋網絡。

Compose 用於將多個容器組合在一起。 現在它們彼此相關是有道理的,盡管它們可能不是。 但是讓我們假設一個典型的案例,當容器用於彼此相關的服務時,您會希望它們以某種方式相互通信,但又要控制它們如何使用網絡相互通信。 例如,以一個具有 web 服務器、應用服務器和數據庫的 3 層應用程序為例。 假設所有三個組件都已 dockerized,並且您正在使用 compose 將它們組合在一起,而不是運行docker run..使用不同的參數三次等。所有三個都會出現,但您需要控制它們如何相互連接。 您希望網絡服務器能夠與應用服務器通信,但不能直接與數據庫通信。 並且您希望應用服務器與(ping)db 服務器容器並ping web 服務器。 所有連接都是雙向的,但僅限於您希望能夠相互通信的那些服務。 對於這樣的安排,您通常會設置 2 個網絡 - 比如frontendbackend Web 和應用程序容器連接到前端網絡。 app 和 db 容器連接到后端網絡。 因為 db 和 web 容器之間沒有公共網絡,所以它們不能相互接觸(ping),這是您的意圖。

現在,如果您希望這 3 個服務能夠在由 100 台機器組成的集群上運行,並且您還希望在它們之間進行擴展,您將需要一個跨越多個主機的網絡。 這就是覆蓋網絡(在 swarm 中)出現的地方。 覆蓋網絡只不過是基於 VxLAN 技術構建的多主機網絡。 您不必了解 VxLAN,除了它是幾乎所有現代網絡基礎設施都支持的標准網絡拓撲。

我希望澄清。

編輯:我沒有看到你已經得到了答案!

我認為您對每個是什么都有大部分正確的理解,但是需要進行一些調整。

你是對的 docker-compose 是為了啟動多容器應用程序。 之前你曾經用docker run ..來啟動每個容器。 通常,包含微服務范式的現代應用程序可以由數十個服務組成,並且使用docker run ..很快就會變得非常煩人。 因此,docker-compose 允許您將所有容器及其屬性以及它們如何作為yamljson文件相互連接,以便您可以更輕松地對其進行管理。

因此,docker-compose 是 docker 生態系統中的容器編排部分。

鏈接是不同的,它們只是 docker-compose 或docker run命令的一部分,被棄用,以支持software defined networks ,其中overlay networks只是其中之一。

Swarm 是 docker 中的調度組件。 什么是調度 - 只是弄清楚將容器“放置”在 docker 主機集群中的何處。 您可以擁有數百個服務器的集群,也可能擁有數百個容器,每個容器都為十幾個不同的應用程序封裝了一個服務。 現在,這些容器應該如何分布在數百個服務器的集群中,是否應該將某些容器僅放置在某些主機上,因為它們滿足特定標准,或者它們應該更接近(或不)其他以某種方式相關的容器......所有這些都是由 docker Swarm 執行的調度組件的一部分。

我建議您在此處閱讀 docker.com 上的入門文檔: https ://docs.docker.com/engine/getstarted-voting-app/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM