Docker Swarm入門(一)概觀
原文 http://dockerone.com/article/168
【編者的話】本文作者 Matt Bajor 熱衷Docker及其相關產品的研究,本文是他寫的Docker Swarm入門系列博客的第一篇,主要介紹了Docker Swarm的基本概念以及它的工作原理。
Docker Swarm 是什么?
Docker Swarm 是一個用于創建Docker主機(運行Docker守護進程的服務器)集群的工具,使用Swarm操作集群,會使用戶感覺就像是在一臺主機上進行操作。在 DockerCon歐洲大會 宣布Swarm相關技術之前,我就曾經在 Docker Global Hack Day 上對于Swarm的相關技術進行了介紹。在這次hackday上,大家介紹了一些 非常酷的新技術 ,包括Docker Swarm(譯者注:Docker集群工具)、Docker Machine(譯者注:Docker管理工具)以及Docker Compose(譯者注:Docker編排工具)。由于 Ansible (一個自動化的運維工具)與Machine和Compose有類似的功能,所以Swarm服務更能引起我的興趣。
在會上,Victor Vieux與Andrea Luzzardi介紹了有關Swarm的基本概念,并且演示了Swarm的基本工作流程,他們還提出了一個非常有趣的結論:雖然POC (概念驗證proof of concept)是在功能上對項目進行論證并且能夠進行基本的展示,但是這是以忽略整個的項目代碼并且從頭開始構建項目為代價的。我很贊同這個想法,在以 后對一個項目進行POC時也要牢記這一點。
Swarm守護進程是使用Go語言編寫的, 截止到目前 仍然處于Alpha階段。Swarm項目的發展速度很快,幾乎每天都會有新的功能和特性更新,據說, @vieux 本人也十分支持在項目中添加的功能,并且歡迎通過GitHub的 Issue 來修復bug。雖然我暫時不推薦在生產環境中使用Swarm,但是我相信它會是一個非常有前景的技術。
Docker Swarm 如何工作?
對Swarm進行操作的過程與處理單個Docker主機非常相似,無需進行太多修改,它就可以和現有的工具鏈進行很好的交互。Swarm是運行在 Linux機器上的守護程序,它所綁定的網絡接口與獨立Docker實例相同(http/2375或https/2376)。Swarm 守護進程可以與標準的Docker客戶端>=1.4.0相連接并接受其發送來的信息,之后,Swarm服務會對來自Docker客戶端的指令信息進行配置,最后通過代理的方式把信息發送給不同的Docker的 守護進程,Swarm服務同時也監聽著標準的Docker端口。 比如,Swarm會基于不同的打包算法并結合Docker守護進程在啟動時候所指定好的標簽(tags),把create命令分配到不同的Docker守護進程上來執行。根據這一特性,用戶可以創建由不同的Docker主機所構成的分區集群(partitioned cluster)并且將整個集群在邏輯上以一個單一的Docker終端的形式暴露給用戶,Swarm使這個過程變得極其簡單。
與Swarm的交互“或多或少”地類似于與一個非集群的Docker實例的交互,但是也有一些需要注意的地方。Swarm并非對所有的 Docker命令提供一對一的支持。這不僅是由于兩種服務在體系結構上的區別,還因為Swarm服務剛剛起步不久,有些命令尚未得到實現(我想有些可能永 遠不會被實現)。當前幾乎一切需要運行容器的命令都是可用的,包括以下的常用命令(還有其他的):
- docker run
- docker create
- docker inspect
- docker kill
- docker logs
- docker start
以上介紹的內容是運行該工具時所需的重要組成部分。下面介紹一下在最常見的配置情況下,相關的技術具體如何運行:
- Docker主機服務(服務器上的Docker守護進程)通過--label key=value被啟動并對網絡進行監聽。
- Swarm守護進程被啟動并指向一個文件,這個文件包含有構成集群的主機以這些主機所監聽的端口列表。
- Swarm與每個Docker主機交互并確定他們的標記、健康狀況以及資源使用量,并維護后端和它們元數據的列表。
- 客戶端通過它的網絡端口(2375)與Swarm交互。與Swarm的交互方式與Docker交互的方式類似:創建、銷毀、運行、依附(attach)并獲得運行容器的日志以及其他相關內容。
- 當一個命令發出給Swarm,Swarm會:
- 基于提供的constraint標簽、終端的健康程度以及調度算法來決定把命令發送到哪里。
- 針對合適的Docker守護進程執行命令。
- 返回結果的格式與Docker守護進程相同。
Swarm守護進程本身相當于是一個調度器和一個路由器。它實際上并沒有運行容器,也就是說,如果Swarm服務停止了,它在終端Docker主 機上已分配好的容器仍然是開啟的。另外,由于它不處理任何網絡路由(網絡連接需要被直接發送到后端的Docker主機上),即使Swarm守護進程意外終 止,運行的容器仍然可用。當Swarm從這樣的崩潰中恢復,它依然能夠查詢終端以重建其元數據的列表。
由于Swarm的設計理念,在所有的運行時的活動與Swarm服務交互的過程中,幾乎與其他Docker守護進程的交互過程是相同的,比如:Docker 客戶端、docker-py、docker-api gem等。然而,目前Ansible似乎在 TLS 模式 下不能與Swarm共同使用,但它似乎不僅僅影響也影響Swarm的使用,也影響Docker守護程序本身的使用。
這是有關Docker Swarm系列博文的第一篇。由于缺少相關的技術細節,我表示抱歉,但在隨后的文章中會包含一些架構、代碼片段以及相關的實踐 :) 請留意第二篇:Docker Swarm的配置選項與需求,即將推出。
所有這些研究工作得以順利進行,都歸功于我工作的公司: Rally Software in Boulder, CO. 。每季度我們至少有一個駭客周,它使我們能夠研究很棒的東西,像Docker Swarm。如果您想切入正題,直接開始Vagrant 例子,這里有一個repo,它是我在2014年Q1駭客周研究的成果: https://github.com/technolo-g/docker-swarm-demo
原文鏈接: Intro to Docker Swarm: Part 1 - Overview (翻譯: 田浩浩 審校:王哲)
===========================
譯者介紹
田浩浩, 悉尼大學USYD 碩士研究生,目前在珠海從事Android應用開發工作。業余時間專注Docker的學習與研究,希望通過DockerOne把最新最優秀的譯文貢獻給大家,與讀者一起暢游Docker的海洋。