成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

代碼級操作指南 | 如何在Docker Swarm中運行服務

Winer / 3756人閱讀

摘要:節(jié)點管理器將利用該聲明該集群服務。在本示例當中,我們將部署一項服務。此標記用于告知公布端口作為該服務的可用端口。將此稱為入口負載均衡。當外部系統(tǒng)調(diào)用某項服務時,接收節(jié)點會接受流量并利用提供的內(nèi)部服務對其進行負載均衡。

最新版本Docker Engine v1.12中,包含了多項與Docker Swarm緊密相關的功能變更。在今天的文章中,數(shù)人云將和大家探討如何利用Docker的Swarm Mode進行服務部署。

在Ubuntu 16.04之上激活Swarm Mode

在向Docker Engine Swarm部署一項服務之前,我們首先需要設置一套Swarm集群。由于本文旨在展示1.12版本中的各項新增功能,因此我們應當安裝Docker Engine的最新版本。

以下操作指南適用于Ubuntu 16.04環(huán)境下的Docker Engine安裝。對于其它版本及平臺,大家可以查看Docker的官方安裝指南。

設置Docker Apt庫

在安裝過程中,我們需要使用Ubuntu提供的標準安裝方法,即Apt軟件包管理器。由于我們將安裝Docker Engine的最新版本,因此需要配置Apt以從Docker官方Apt庫處獲取docker-engine軟件包,而非直接使用系統(tǒng)預配置庫。

添加Docker公鑰

配置Apt以使用新庫的第一步,需要使用apt-key命令將該庫的公鑰添加至Apt緩存當中。

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

以上apt-key命令會向p80.pool.sks-keyservers.net密鑰服務器請求該特定密鑰(58118E89F3A912897C070ADBF76221572C52609D)。該公鑰將被用于驗證下載自此新庫的全部軟件包。

指定Docker的庫位置

現(xiàn)在Docker公鑰已經(jīng)導入完成,我們可以配置Apt以使用Docker項目的庫服務器。要實現(xiàn)這一目標,我們需要在/etc/apt/sources.list.d/目錄內(nèi)添加以下條目。

# echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" >> /etc/apt/sources.list.d/docker.list

在刷新Apt軟件包緩存時,Apt會對sources.list.d/目錄內(nèi)的全部文件進行搜索,旨在查找新的軟件包庫。以上命令會創(chuàng)建(若尚不存在)一個名為docker.list的新文件,并將對應條目添加至apt.dockerproject.org庫當中。

更新Apt的軟件包緩存

要更新Apt的軟件包緩存,我們可以運行apt-get命令并添加update選項。

# apt-get update

如此一來,Apt會通過重新讀取全部配置文件以填充各庫列表,其中包括我們剛剛添加的配置文件。另外,其還將查詢這些庫以緩存一份可用軟件包清單。

安裝linux-image-extra的先決條件

在安裝Docker Engine之前,我們還需要安裝另一軟件包。linux-image-extra軟件包是一套特定內(nèi)核軟件包,負責幫助Ubuntu系統(tǒng)支持aufs存儲驅(qū)動器。此驅(qū)動程序由Docker用于向容器內(nèi)安裝各分卷。

要安裝此軟件包,我們需要再次使用apt-get命令,但這一次配合install選項。

# apt-get install linux-image-extra-$(uname -r)

在此apt-get命令當中,$(uname -r)部分或者命令將返回當前運行中內(nèi)核的實際版本。任何對此系統(tǒng)內(nèi)核的更新都應包含對應linux-image-extra軟件包版本的安裝。如果此軟件包未進行更新,則Docker可能會在安裝分卷時出現(xiàn)某些問題。

安裝Docker Engine

Apt配置完成且linux-image-extra安裝完畢之后,我們現(xiàn)在可以著手安裝Docker Engine。要完成這項任務,我們需要再次使用apt-get命令配合install選項,從而安裝docker-engine軟件包。

# apt-get install docker-engine

在這里,我們應當已經(jīng)擁有Docker Engine v1.12.0或者更新版本。要驗證是否具備正確版本,可以執(zhí)行docker命令配合version選項。

# docker versionClient:
Version:      1.12.0
API version:  1.24
Go version:   go1.6.3
Git commit:   8eab29e
Built:        Thu Jul 28 22:11:10 2016
OS/Arch:      linux/amd64
Server:
Version:      1.12.0
API version:  1.24
Go version:   go1.6.3
Git commit:   8eab29e
Built:        Thu Jul 28 22:11:10 2016
OS/Arch:      linux/amd64

在這里,我們可以看到服務器與客戶端版本皆為1.12.0。下面開始創(chuàng)建Swarm。

創(chuàng)建 Docker Swarm

在本篇教程中,我們將跨越多臺設備執(zhí)行此項任務。為了清晰起見,這里我們在命令示例中包含主機名稱。

我們首先建立一套雙節(jié)點Swarm集群,其中的兩個節(jié)點皆應利用上述操作完成Docker Engine的安裝。

在創(chuàng)建該Swarm集群時,我們需要指定一個節(jié)點管理器。在本示例中,我們將使用名稱為swarm-01的主機作為節(jié)點管理器。要讓swarm-01成為節(jié)點管理器,我們需要首先在swarm-01之上執(zhí)行一條命令以創(chuàng)建Swarm集群。這里我們使用docker命令配合swarm init選項。

root@swarm-01:~# docker swarm init --advertise-addr 10.0.0.1
Swarm initialized: current node (awwiap1z5vtxponawdqndl0e7) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join    
    --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb     
    10.0.0.1:237
7To add a manager to this swarm, run the following command:
    docker swarm join    
    --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-bwex7fd4u5aov4naa5trcxs34    
    10.0.0.1:2377

利用以上命令外加swarm init,我們還利用10.0.0.1值指定了--advertise-addr標記。Swarm節(jié)點管理器將利用該IP聲明該Swarm集群服務。盡管該地址屬于專有IP,但為了讓各節(jié)點順利加入此Swarm,各節(jié)點都需要能夠通過此IP在端口2377上接入此節(jié)點管理。

在運行docker swarm init命令之后,我們會看到swarm-01已經(jīng)被分配了一個節(jié)點名稱(awwiap1z5vtxponawdqndl0e7)并成為此Swarm集群中的管理器。其輸出結(jié)果分為兩條命令:其一用于向該Swarm內(nèi)添加一個工作節(jié)點,其二為向該Swarm內(nèi)添加另一節(jié)點管理器。

Docker Swarm Mode能夠支持多套節(jié)點管理器,不過其仍會選擇其中之一作為主節(jié)點管理器,并由其負責Swarm集群內(nèi)部的編排工作。

向Swarm集群內(nèi)添加一個工作節(jié)點

在Swarm集群創(chuàng)建完成后,現(xiàn)在我們可以利用由Swarm創(chuàng)建給出的輸出結(jié)果,通過docker命令添加新的工作節(jié)點。

root@swarm-02:~# docker swarm join 
> --token SWMTKN-1-51pzs5ax8dmp3h0ic72m9wq9vtagevp1ncrgik115qwo058ie6-3fokbd3onl2i8r7dowtlwh7kb 
> 10.0.0.1:2377
This node joined a swarm as a worker.

在本示例中,我們將swarm-02添加至Swarm當中作為工作節(jié)點。工作節(jié)點屬于Swarm集群當中的一個成員,其角色在于運行各類任務; 而其中的任務則表現(xiàn)為容器形式。在另一方面,節(jié)點管理器則負責管理任務(容器)編排并維護Swarm集群本身。

除了節(jié)點管理職責之外,節(jié)點管理器本身亦作為工作節(jié)點存在,意味著其同樣能夠為Swarm集群分擔部分任務。

查看當前Swarm節(jié)點

在上述命令執(zhí)行完畢之后,現(xiàn)在我們已經(jīng)擁有了一套基本的雙節(jié)點Swarm集群。下面我們執(zhí)行docker命令與node ls選項以驗證集群的當前狀態(tài)。

root@swarm-01:~# docker node ls
ID                           HOSTNAME              STATUS  AVAILABILITY  MANAGER STATUS
13evr7hmiujjanbnu3n92dphk    swarm-02.example.com  Ready   Active        
awwiap1z5vtxponawdqndl0e7 *  swarm-01.example.com  Ready   Active        Leader

從此命令的輸出結(jié)果中,我們可以看到swarm-01與swarm-02都處于Ready與Active狀態(tài)。如此一來,現(xiàn)在我們即可進一步向此套Swarm集群部署服務了。

創(chuàng)建一項服務

在Docker Swarm Mode當中,服務屬于一套長期運行的Docker容器,其可被部署在任意工作節(jié)點之上。另外,該服務亦允許任意Swarm集群內(nèi)的遠程系統(tǒng)或者容器進行接入與使用。

在本示例當中,我們將部署一項Redis服務。

部署一項復制服務

復制服務屬于一項Docker Swarm服務,其中包含特定數(shù)量的運行副本。這些副本由特定Docker容器的多個實例所構(gòu)成。在本示例中,每套副本都將表現(xiàn)為一個獨特的Redis實例。

要創(chuàng)建新服務,我們使用docker命令并配合service create選項。以下命令將創(chuàng)建一項名為redis的服務,其擁有2套副本并在整套集群內(nèi)通過6379端口進行發(fā)布。

root@swarm-01:~# docker service create --name redis --replicas 2 --publish 6379:6379 redis
er238pvukeqdev10nfmh9q1kr

除了指定service create選項之外,我們還需要使用--name標記以命名redis服務,并由--replicas標記指定該服務應運行在2套不同節(jié)點之上。我們可以在兩個節(jié)點中執(zhí)行docker命令配合service ls選項以實現(xiàn)這一效果。

root@swarm-01:~# docker service ls
ID            NAME   REPLICAS  IMAGE  COMMAND
er238pvukeqd  redis  2/2       redis

在輸出結(jié)果中,我們可以看到2套副本中的2套正處于運行當中。如果我們希望了解與這些任務相關的更多細節(jié)信息,則可運行docker命令配合service ps選項。

root@swarm-01:~# docker service ps redis
ID                         NAME     IMAGE  NODE                  DESIRED STATE  CURRENT STATE           ERROR
5lr10nbpy91csmc91cew5cul1  redis.1  redis  swarm-02.example.com  Running        Running 40 minutes ago  
1t77jsgo1qajxxdekbenl4pgk  redis.2  redis  swarm-01.example.com  Running        Running 40 minutes ago

其中service ps選項將顯示此特定服務的全部任務(容器)。在本示例中,我們可以看到redis服務擁有一項任務(容器),且同時運行在兩個Swarm節(jié)點之上。

接入此 Redis服務

由于我們已經(jīng)證實此服務開始運行,因此接下來可利用redis-cli客戶端立足于遠程系統(tǒng)接入該項服務。

vagrant@vagrant:~$ redis-cli -h swarm-01.example.com -p 6379
swarm-01.example.com:6379>

通過以上連接,我們能夠成功接入該redis服務。這意味著我們的服務已經(jīng)啟動并處于可用狀態(tài)。

DockerSwarm如何公布服務

在創(chuàng)建此redis服務時,我們使用了--publish標記并配合docker service create命令。此標記用于告知Docker公布6379端口作為該redis服務的可用端口。

而當Docker為某項服務發(fā)布端口時,其會在Swarm集群內(nèi)的全部節(jié)點之上監(jiān)聽該端口。當有流量經(jīng)過該端口,則對應流量會被路由至負責運行該服務的對應容器。盡管此概念在全部節(jié)點皆運行單一服務容器時能夠以標準化方式實現(xiàn),但在面對多套副本時則會發(fā)生一些變化。

要了解其工作原理,讓我們向Swarm集群中添加第三個工作節(jié)點。

將第三個工作節(jié)點添加進來

要添加另一工作節(jié)點,我們只需要重復文章開頭處的安裝與設置步驟即可。這里直接跳過重復部分,而后再次運行docker命令以檢查集群中的當前運行狀態(tài)。

root@swarm-01:~# docker node ls
ID                           HOSTNAME              STATUS  AVAILABILITY  MANAGER STATUS
13evr7hmiujjanbnu3n92dphk    swarm-02.example.com  Ready   Active        
awwiap1z5vtxponawdqndl0e7 *  swarm-01.example.com  Ready   Active        Leader
e4ymm89082ooms0gs3iyn8vtl    swarm-03.example.com  Ready   Active

現(xiàn)在可以看到我們的集群由三個節(jié)點構(gòu)成:
swarm-01
swarm-02
swarm-03
當我們利用兩套副本創(chuàng)建服務時,其會在swarm-01與swarm-02之上創(chuàng)建任務(容器)。下面看看添加另一工作節(jié)點會對此產(chǎn)生何種影響。

root@swarm-01:~# docker service ps redis
ID                         NAME     IMAGE  NODE                  DESIRED STATE  CURRENT STATE           ERROR
5lr10nbpy91csmc91cew5cul1  redis.1  redis  swarm-02.example.com  Running        Running 55 minutes ago  
1t77jsgo1qajxxdekbenl4pgk  redis.2  redis  swarm-01.example.com  Running        Running 55 minutes ago

利用復制服務,Docker Swarm能夠確保每套指定副本皆擁有一個任務(容器)處于運行當中。在創(chuàng)建redis服務時,我們指定其中應存在2套副本。這意味著即使添加第三個節(jié)點,Docker仍然不會在該節(jié)點上建立新的任務。

這樣一來,我們就面對著一種有趣的狀態(tài):我們的服務運行在3個Swarm節(jié)點中的2個之上。在非Swarm環(huán)境下,這意味著redis服務將無法接入第三個Swarm節(jié)點。然而由于Swarm Mode的存在,這種接入關系仍可正常實現(xiàn)。

在未運行任務的工作節(jié)點上接入服務

之前我們已經(jīng)探討了Docker如何公布一個服務端口,當時提到該端口會被公布至Swarm內(nèi)的全部節(jié)點。而真正值得關注的是,當我們接入某個并未運行服務相關容器(任務)的工作節(jié)點時,會發(fā)生怎樣的情況。

下面我們看看經(jīng)由redis公開端口接入swarm-03,會有怎樣的結(jié)果。

vagrant@vagrant:~$ redis-cli -h swarm-03.example.com -p 6379
swarm-03.example.com:6379>

有趣的是,我們的連接嘗試仍然能夠成功。之所以成功,是因為盡管swarm-03并沒有運行任何redis容器,但Docker內(nèi)部會將我們的redis服務流量重新路由至運行有redis容器的工作節(jié)點。

Docker將此稱為入口負載均衡。其工作原理在于,全部工作節(jié)點都會監(jiān)聽指向公開服務端口的連接。當外部系統(tǒng)調(diào)用某項服務時,接收節(jié)點會接受流量并利用Docker提供的內(nèi)部DNS服務對其進行負載均衡。

所以即使我們將Swarm集群擴展至包含100個工作節(jié)點,服務的最終用戶仍然能夠輕松接入任意工作節(jié)點。他們的請求隨后會被重新定向至兩套運行有redis服務任務(容器)的Docker主機之一。

這種重新路由與負載均衡機制對于最終用戶是完全透明的,且全程發(fā)生于Swarm集群內(nèi)部。

實現(xiàn)全局服務

現(xiàn)在我們設置的redis服務已經(jīng)運行有2套副本,意味著其運行在3個節(jié)點中的2個之上。

如果希望我們的redis服務在每個工作節(jié)點上皆擁有實例,我們可以將服務的必要副本數(shù)量由2修改為3。這意味著只要添加或者除去工作節(jié)點,我們就需要對副本數(shù)量做出調(diào)整。

當然,我們也可以將服務轉(zhuǎn)化為全局服務從而自動完成上述調(diào)整。Docker Swarm Mode中的全局服務用于創(chuàng)建能夠自動在各個工作節(jié)點上擁有運行任務的服務。這項機制適用于Redis等需要在內(nèi)部由其它服務使用的常規(guī)服務。

要完成這一調(diào)整,我們需要將自己的redis服務重新創(chuàng)建為一項全局服務。

root@swarm-01:~# docker service create --name redis --mode global --publish 6379:6379 redis
5o8m338zmsped0cmqe0guh2to

以上命令同樣使用docker service create命令進行復制服務的創(chuàng)建,不過區(qū)別在于--mode標記之后添加了global值。

服務創(chuàng)建完成之后,可以看到Docker如何一次執(zhí)行docker命令與service ps選項將該服務的各項任務進行分發(fā)。

root@swarm-01:~# docker service ps redis
ID                         NAME       IMAGE  NODE                  DESIRED STATE  CURRENT STATE           ERROR
27s6q5yvmyjvty8jvp5k067ul  redis      redis  swarm-03.example.com  Running        Running 26 seconds ago  
2xohhkqvlw7969qj6j0ca70xx   \_ redis  redis  swarm-02.example.com  Running        Running 38 seconds ago  
22wrdkun5f5t9lku6sbprqi1k   \_ redis  redis  swarm-01.example.com  Running        Running 38 seconds ago

現(xiàn)在該服務已經(jīng)被創(chuàng)建為全局服務,接下來Swarm集群內(nèi)的各個節(jié)點皆將運行與之相關的任務(容器)。

總結(jié)

在本篇文章中,我們不僅完成了Docker Engine的安裝,同時亦設置了一套Swarm集群,部署了復制服務而后創(chuàng)建了全局服務。

在將Docker Swarm Mode服務與Kubernetes服務進行比較時,我們發(fā)現(xiàn)Swarm Mode服務的設置與創(chuàng)建更為簡便易行。如果大家需要使用Kubernetes的“服務”功能但又用不到其它機制,那么Docker Swarm Mode可能是更為理想的便捷選項。

(文章轉(zhuǎn)自:CODESHIP,作者 Ben Cane)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26683.html

相關文章

  • 代碼干貨 | 進階Docker 1.12,全新的分布式應用捆綁包

    摘要:利用分布式應用捆綁包簡稱部署服務相較于利用大量參數(shù)創(chuàng)建網(wǎng)絡及服務,這里我們選擇使用一個文件。 在Docker 1.12版本中,全新的Swarm捆綁包相較于原有編排及調(diào)度機制做出了巨大改進。它不再需要運行一組獨立的Swarm容器,這部分容器已經(jīng)被直接捆綁在Docker Engine當中,故障轉(zhuǎn)移策略更為可靠,服務發(fā)現(xiàn)機制實現(xiàn)內(nèi)置,新的網(wǎng)絡功能極為順暢……看起來很棒是不是? 數(shù)人云這...

    2i18ns 評論0 收藏0
  • 容器技術(shù)開源項目綜述

    摘要:年容器大火,圍繞著容器技術(shù)的發(fā)展也涌現(xiàn)了許多新項目。項目類本節(jié)綜述了目前開源社區(qū)和互聯(lián)網(wǎng)公司圍繞容器技術(shù)開發(fā)的相關項目。是公司開源項目,旨在為提供守護進程。 2015年容器大火,圍繞著容器技術(shù)的發(fā)展也涌現(xiàn)了許多新項目。同時,許多老項目也開始支持容器作為運行環(huán)境。下面介紹這些項目: 規(guī)范標準類 容器使用了Linux內(nèi)核的特性,Docker的成功也主要在于其充分挖掘了此類特性。但Docke...

    JeOam 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<