[英]When to use Docker-Compose and when to use Docker-Swarm
我試圖了解Docker-Compose和Docker-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 run
類的命令重現它的行為。回答問題:
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 個網絡 - 比如frontend
和backend
。 Web 和應用程序容器連接到前端網絡。 app 和 db 容器連接到后端網絡。 因為 db 和 web 容器之間沒有公共網絡,所以它們不能相互接觸(ping),這是您的意圖。
現在,如果您希望這 3 個服務能夠在由 100 台機器組成的集群上運行,並且您還希望在它們之間進行擴展,您將需要一個跨越多個主機的網絡。 這就是覆蓋網絡(在 swarm 中)出現的地方。 覆蓋網絡只不過是基於 VxLAN 技術構建的多主機網絡。 您不必了解 VxLAN,除了它是幾乎所有現代網絡基礎設施都支持的標准網絡拓撲。
我希望澄清。
編輯:我沒有看到你已經得到了答案!
我認為您對每個是什么都有大部分正確的理解,但是需要進行一些調整。
你是對的 docker-compose 是為了啟動多容器應用程序。 之前你曾經用docker run ..
來啟動每個容器。 通常,包含微服務范式的現代應用程序可以由數十個服務組成,並且使用docker run ..
很快就會變得非常煩人。 因此,docker-compose 允許您將所有容器及其屬性以及它們如何作為yaml
或json
文件相互連接,以便您可以更輕松地對其進行管理。
因此,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.