在上一篇文章中咱們介紹瞭如何經過compose來定義並運行一組service(容器),若是是在分佈式的應用場景中,一般會有一個集羣的概念,即在集羣中部署並管理咱們的應用程序。一樣的Docker也提供了相應的模式來管理咱們的一組容器,即Swarm Mode。node
從Docker 1.12開始Swarm mode已經內嵌入了Docker引擎中,成爲了docker的子命令docker swarm,再也不須要咱們單獨去安裝Docker Swarm。Swarm使用SwarmKit構建,是Docker引擎內置(原生)的集羣管理和編排工具。提供了對Docker容器集羣的管理服務。在開始動手實踐以前讓咱們先來了解幾個概念。linux
以前作過度布式開發和部署的小夥伴對節點的概念必定不會陌生。在分佈式開發和部署中咱們管一臺服務器稱爲一個節點。一樣的在Docker Swarm Mode中也有節點的概念。運行Docker的主機能夠主動初始化一個Swarm集羣或者加入一個已存在的Swarm集羣,這樣這個運行Docker的主機就成爲一個Swarm集羣的節點(node)。git
節點分爲管理(manager)節點和工做(worker)節點。web
管理節點用於Swarm集羣的管理,工做節點是任務執行節點,管理節點將服務(service)以任務(task)的形式下發至工做節點執行。管理節點默認也做爲工做節點。引用docker官網的圖片來展現集羣中管理節點與工做節點的關係,以下圖所示:docker
任務(Task): 是Swarm中最小的調度單位,能夠把他理解成一個單一的容器。安全
服務(Services): 是一組任務的集合,服務定義了任務的屬性。服務有兩種模式:服務器
replicated services: 按照必定規則在各個工做節點上運行指定個數的任務。負載均衡
global services: 每一個工做節點上運行一個任務。分佈式
下方來自Docker官網的圖片形象的展現了容器,任務,服務的關係, 如圖所示:工具
docker內置了docker swarm的相關指令,咱們能夠經過docker swarm init來開啓swarm集羣,以下圖所示:
執行docker swarm init命令的節點會自動成爲管理節點。
注意: 若是你的docker主機有多個網卡,擁有多個IP,須要在docker swarm init後面加入
--advertise--addr,以指定被監聽的ip和port,以便其餘節點能夠加入到集羣中。
這樣就建立了一個單節點的集羣,咱們能夠經過指令docker node ls來查看集羣中的節點信息,如圖所示:
單節點集羣已經建立好,接下來咱們來看如何向集羣中部署服務,上篇文章中咱們講到經過compose file部署啓動多個容器,一樣在Swarm中咱們也可使用compose文件來配置,啓動多個服務。咱們繼續使用上節課的docker-compose.yml文件,並在文件中加入一些部署相關的信息,新的文件內容以下圖所示:
紅色框中是咱們新添加的節點信息:
deploy節點定義了service(包含某個業務功能的鏡像或docker容器)的部署策略,replicas表示在docker集羣的節點中運行2個服務實例(容器實例),具體在哪些節點運行由docker內部進行分配,limits限制了每一個實例所使用的最大cpus爲10%,最大memory爲50MB RAM,並設置服務實例的重啓機制爲一旦某個容器發生故障,則當即重啓容器。
如今讓咱們在建立的單節點集羣中部署這組服務。docker提供了docker stack deploy指令來利用compose文件部署服務,讓咱們進入到docker-compose.yml所在的文件夾,並執行以下指令:docker stack deploy -c docker-compose.yml servicestacklab ,結果如圖所示:
該指令所表達的意思是經過執行docker-compose.yml文件中的腳原本建立一個名爲servicestacklab的stack的服務組。咱們能夠經過指令docker stack ls來查看當前swarm中有哪些stack服務組,結果如圖所示:
咱們能夠看到在當前的swarm中只有一個名爲servicestacklab的服務組,而且這個服務組中只有一個service。
咱們能夠經過執行docker stack services 指令來查看stack中有哪些服務,執行指令docker stack services servicestacklab,結果如圖所示:
service的命名規則爲:stackname_servicename, stackname爲咱們docker stack deploy中定義的servicestacklab,servicename是咱們compose文件中定義的每個service的name,在該實例的compose文件中咱們只定義了一個名爲weblab的service,所以最終的服務名稱爲servicestacklab_weblab, 能夠參照上方compose file內容的截圖。
上面咱們提到過,管理節點將服務(service)以任務(task)的形式下發至工做節點執行,在咱們的部署策略中咱們設置的在每一個node中部署一個服務的兩個task,那麼咱們能夠經過指令docker service ps servicename來查看一個服務的task狀況,指令爲docker service ps servicestacklab_weblab, 結果如圖所示:
咱們能夠看到在node名爲linuxkit-00155d6f91aa的節點上以task的形式運行了兩個servicestacklab_weblab服務的實例,task的名爲servicestacklab_weblab.1和servicestacklab_weblab.2。
咱們經過docker ps -a指令來查看當前運行的容器實例信息,結果如圖所示:
能夠看到當前有兩個正在運行的容器,你們記住這兩個容器實例的ContainerID分別爲:
037776ed23d3和9f3fcf0ba7d9
接下來,咱們經過在文件中暴露的5000端口來訪問這個服務:http://localhost:5000,在頁面中我打印出了當前machine的name(即container的id),咱們多刷新幾回頁面查看MachineName的變化,獲得以下兩張圖:
能夠發現Swarm爲咱們實現了服務訪問的負載均衡。除了負載均衡以外,Swarm mode還內置了服務發現,路由網格,動態伸縮,滾動更新,安全傳輸等功能。你們在據說docker的同時也必定據說過Kubernetes,Swarm Mode與Kubernetes相似,K8S也提供了對docker集羣管理的相關功能,後期會找時間爲你們介紹一下如何經過K8S來管理Docker集羣。
本篇文章咱們就介紹到這裏,但願能讓你們對Docker的Swarm Mode有必定的瞭解,下一篇文章會爲你們講解如何在單臺機器上實現包含多docker主機的集羣,以實現模擬在多docker主機之間的分佈式部署。
相關資料:
yeasy.gitbooks.io/docker_prac…