新聞中心
Swarm是Docker公司推出的用來管理docker集群的平臺,幾乎全部用GO語言來完成的開發(fā)的,代碼開源在https://github.com/docker/swarm, 它是將一群Docker宿主機變成一個單一的虛擬主機,Swarm使用標準的Docker API接口作為其前端的訪問入口,換言之,各種形式的Docker

站在用戶的角度思考問題,與客戶深入溝通,找到光澤網站設計與光澤網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都網站制作、成都做網站、外貿營銷網站建設、企業(yè)官網、英文網站、手機端網站、網站推廣、域名與空間、網絡空間、企業(yè)郵箱。業(yè)務覆蓋光澤地區(qū)。
Client(compose,docker-py等)均可以直接與Swarm通信,甚至Docker本身都可以很容易的與Swarm集成,這大大方便了用戶將原本基于單節(jié)點的系統(tǒng)移植到Swarm上,同時Swarm內置了對Docker網絡插件的支持,用戶也很容易的部署跨主機的容器集群服務。
Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個服務器或主機上創(chuàng)建多個容器的工具,而 Docker Swarm 則可以在多個服務器或主機上創(chuàng)建容器集群服務,對于微服務的部署,顯然 Docker Swarm 會更加適合。
從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),并且已經內置了服務發(fā)現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發(fā)現配置了。
n只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受Docker客戶端發(fā)來的請求,調度適合的節(jié)點來運行容器,這就意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點也會照常運行,放Swarm重新恢復運行之后,他會收集重建集群信息。
技術概要
如果把 Docker 詳細而又好用的文檔照搬到這里那將太丟人了,所以我將簡要概括下這個技術的概要。我們已經有了 Docker,對吧?,F在,你想要更多的服務器作為 Docker 主機,但同時你希望它們屬于同一個邏輯上的實體。也就是說,你想建立一個集群。 我們先從一個主機組成的集群開始。當你在一個主機上初始化一個 Swarm 集群,這臺主機將成為這個集群的管理者manager。從技術角度來講,它成為了共識組consensus group中的一個節(jié)點node。其背后的數學邏輯建立在 Raft 算法之上。管理者manager負責調度任務。而具體的任務則會委任給各個加入了 Swarm 集群的工作者worker節(jié)點。這些操作將由 Node API 所管理。雖說我討厭 API 這個詞匯,但我必須在這里用到它。
Service API 是這個實現中的第二個組件。它允許管理者manager節(jié)點在所有的 Swarm 集群節(jié)點上創(chuàng)建一個分布式的服務。這個服務可以被復制replicated,也就是說它們(LCTT 譯注:指這些服務)會由平衡機制被分配到集群中(LCTT 譯注:指 replicated 模式,多個容器實例將會自動調度任務到集群中的一些滿足條件的節(jié)點),或者可以分配給全局(LCTT 譯注:指 global 模式),也就是說每個節(jié)點都會運行一個容器實例。
此外還有更多的功課需要做,但這些信息已經足夠你上路了?,F在,我們開始整些實際的。我們的目標平臺是 CentOS 7.2,有趣的是在我寫這篇教程的時候,它的軟件倉庫中只有 1.10 版的 Docker,也就是說我必須手動更新以使用 Swarm。我們將在另一篇教程中討論這個問題。接下來我們還有一個跟進的指南,其中涵蓋了如何將新的節(jié)點加入我們現有的集群(LCTT 譯注:指剛剛建立的單節(jié)點集群),并且我們將使用 Fedora 進行一個非對稱的配置。至此,請確保正確的配置已經就位,并有一個工作的集群啟動并正在運行(LCTT 譯注:指第一個節(jié)點的 Docker 已經安裝并已進入 Swarm 模式,但到這里筆者并沒有介紹如何初始化 Swarm 集群,不過別擔心下章會講)。
配置鏡像和服務
我將嘗試配置一個負載均衡的 Apache 服務,并使用多個容器實例通過唯一的 IP 地址提供頁面內容。挺標準的吧(LCTT 譯注:指這個負載均衡的網頁服務器)。這個例子同時也突出了你想要使用集群的大多數原因:可用性、冗余、橫向擴展以及性能。當然,你同時需要考慮網絡和儲存這兩塊,但它們超出了這篇指南所涉及的范圍了。
這個 Dockerfile 模板其實可以在官方鏡像倉庫里的 httpd 下找到。你只需一個最簡單的設置來起步。至于如何下載或創(chuàng)建自己的鏡像,請參考我的入門指南,鏈接可以在這篇教程的頂部可以找到。
docker build -t my-apache2 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM httpd:2.4
Trying to pull repository docker.io/library/httpd ...
2.4: Pulling from docker.io/library/httpd
8ad8b3f87b37: Pull complete
c95e1f92326d: Pull complete
96e8046a7a4e: Pull complete
00a0d292c371: Pull complete
3f7586acab34: Pull complete
Digest: sha256:3ad4d7c4f1815bd1c16788a57f81b413...a915e50a0d3a4
Status: Downloaded newer image for docker.io/httpd:2.4
---> fe3336dd034d
Step 2 : COPY ../public-html/ /usr/local/apache2/htdocs/
...
Docker 引擎的 Swarm 模式之入門!Docker 引擎的 Swarm 模式之入門!
Image created
在你繼續(xù)下面的步驟之前,你應該確保你能無錯誤的啟動一個容器實例并能鏈接到這個網頁服務器上(LCTT 譯注:使用下面的命令)。一旦你確保你能連上,我們就可以開始著手創(chuàng)建一個分布式的服務。
docker run -dit --name my-running-app my-apache2
將這個 IP 地址輸入瀏覽器,看看會出現什么。
Swarm 初始化和配置
下一步就是啟動 Swarm 集群了。你將需要這些最基礎的命令來開始,它們與 Docker 博客中的例子非常相似:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
這里我們做了什么?我們創(chuàng)建了一個叫做 frontent 的服務,它有五個容器實例。同時我們還將主機的 80 端口和這些容器的 80 端口相綁定。我們將使用剛剛新創(chuàng)建的 Apache 鏡像來做這個測試。然而,當你在自己的電腦上直接鍵入上面的指令時,你將看到下面的錯誤:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
這意味著你沒有將你的主機(節(jié)點)配置成一個 Swarm 管理者manager。你可以在這臺主機上初始化 Swarm 集群或是讓它加入一個現有的集群。由于我們目前還沒有一個現成的集群,我們將初始化它(LCTT 譯注:指初始化 Swarm 集群并使當前節(jié)點成為 manager):
docker swarm init
Swarm initialized: current node (dm58mmsczqemiikazbfyfwqpd) is now a manager.
為了向這個 Swarm 集群添加一個工作者worker,請執(zhí)行下面的指令:
docker swarm join \
--token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla
9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \
10.0.2.15:2377
為了向這個 Swarm 集群添加一個管理者manager,請執(zhí)行 docker swarm join-token manager 并按照指示操作。
操作后的輸出不用解釋已經很清楚明了。我們成功的創(chuàng)建了一個 Swarm 集群。新的節(jié)點們將需要正確的令牌token來加入這個 Swarm 集群。如果你需要配置防火墻,你還需找到它的 IP 地址和端口(LCTT 譯注:指 Docker 的 Swarm 模式通訊所需的端口,默認 2377)。此外,你還可以向 Swarm 集群中添加管理者節(jié)點?,F在,重新執(zhí)行剛剛的服務創(chuàng)建指令:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
6lrx1vhxsar2i50is8arh4ud1
測試連通性
現在,我們來驗證下我們的服務是否真的工作了。從某些方面講,這很像我們在 Vagrant 和 coreOS 中做的事情那樣。畢竟它們的原理幾乎相同。相同指導思想的不同實現罷了(LCTT 譯注:筆者觀點,無法茍同)。首先需要確保 docker ps 能夠給出正確的輸出。你應該能看到所創(chuàng)建服務的多個容器副本。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
cda532f67d55 my-apache2:latest "httpd-foreground"
2 minutes ago Up 2 minutes 80/tcp frontend.1.2sobjfchdyucschtu2xw6ms9a
75fe6e0aa77b my-apache2:latest "httpd-foreground"
2 minutes ago Up 2 minutes 80/tcp frontend.4.ag77qtdeby9fyvif5v6c4zcpc
3ce824d3151f my-apache2:latest "httpd-foreground"
2 minutes ago Up 2 minutes 80/tcp frontend.2.b6fqg6sf4hkeqs86ps4zjyq65
eda01569181d my-apache2:latest "httpd-foreground"
2 minutes ago Up 2 minutes 80/tcp frontend.5.0rmei3zeeh8usagg7fn3olsp4
497ef904e381 my-apache2:latest "httpd-foreground"
2 minutes ago Up 2 minutes 80/tcp frontend.3.7m83qsilli5dk8rncw3u10g5a
我也測試了不同的、非常規(guī)的端口,它們都能正常工作。對于你如何連接服務器和收取請求你將會有很多可配置的余地。你可以使用 localhost 或者 Docker 網絡接口(筆者注:應該是指 Docker 的默認網橋 docker0,其網關為 172.17.0.1) 的 IP 地址的正確端口去訪問。下面的例子使用了端口 1080:
Replicated Web service works
至此,這是一個非常粗略、簡單的開始。真正的挑戰(zhàn)是創(chuàng)建一個優(yōu)化過的、可擴展的服務,但是它們需要一個準確的技術用例。此外,你還會用到 docker info 和 docker service(還有 inspect 和 ps)命令來詳細了解你的集群是如何工作的。
可能會遇到的問題
你可能會在把玩 Docker 和 Swarm 時遇到一些小的問題(也許沒那么?。1热?SELinux 也許會抱怨你正在執(zhí)行一些非法的操作(LCTT 譯注:指在強制訪問控制策略中沒有權限的操作)。然而,這些錯誤和警告應該不會對你造成太多阻礙。
SELinux alert
-
docker service 不是一條命令(docker service is not a docker command)當你嘗試執(zhí)行必須的命令去創(chuàng)建一個復制模式replicated的服務時,你可能會遇到一條錯誤說 docker: ‘service’ is not a docker command(LCTT 譯注:見下面的例子)。這表示你的 Docker 版本不對(使用 -v 選項來檢查)。我們將在將來的教程討論如何修復這個問題。
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest docker: 'service' is not a docker command. -
docker tag 無法識別(docker tag not recognized)你也許會看到下面的錯誤:
docker service create -name frontend -replicas 5 -p 80:80/tcp my-apache2:latest Error response from daemon: rpc error: code = 3 desc = ContainerSpec: "-name" is not a valid repository/tag關于這個錯誤已經有多個相關的討論和帖子了。其實這個錯誤也許相當無辜。你也許是從瀏覽器粘貼的命令,在瀏覽器中的橫線也許沒被正確解析(筆者注:應該用 –name 而不是 -name)。就是這么簡單的原因所導致的。
擴展閱讀
關于這個話題還有很多可談的,包含 1.12 版之前的 Swarm 集群實現(筆者注:舊的 Swarm 集群實現,下文亦作獨立版本,需要 Consul 等應用提供服務發(fā)現),以及當前的 Docker 版本提供的(筆者注:新的 Swarm 集群實現,亦被稱為 Docker 引擎的 Swarm 模式)。也就是說,請別偷懶花些時間閱讀以下內容:
-
Docker Swarm 概述(獨立版本的 Swarm 集群安裝)
-
構建一個生產環(huán)境的 Swarm 集群(獨立版本安裝)
-
安裝并創(chuàng)建一個 Docker Swarm 集群(獨立版本安裝)
-
Docker 引擎 Swarm 概述(對于 1.12 版)
-
Swarm 模式入門(對于 1.12 版)
總結
你總算看到這里了。到這里仍然無法保證你學到了什么,但我相信你還是會覺得這篇文章有些用的。它涵蓋了一些基礎的概念,以及一個 Swarm 集群模式是如何工作的以及它能做什么的概述,與此同時我們也成功的下載了并創(chuàng)建了我們的網頁服務器的鏡像,并且在之后基于它運行了多個集群式的容器實例。雖然我們目前只在單一節(jié)點做了以上實驗,但是我們會在將來解釋清楚(LCTT 譯注:以便解釋清楚多節(jié)點的 Swarm 集群操作)。并且我們解決了一些常見的問題。
我希望你能認為這篇指南足夠有趣。結合著我過去所寫的關于 Docker 的文章,這些文章應該能給你一個像樣的解釋,包括:怎么樣操作鏡像、網絡棧、儲存、以及現在的集群。就當熱身吧。的確,請享受并期待在新的 Docker 教程中與你見面。我控幾不住我記幾啊。
標題名稱:詳解Docker引擎Swarm
標題URL:http://m.fisionsoft.com.cn/article/dheosgo.html


咨詢
建站咨詢
