溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Docker的引擎Swarm怎么用

發(fā)布時間:2022-02-16 15:22:41 來源:億速云 閱讀:176 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Docker的引擎Swarm怎么用的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Docker的引擎Swarm怎么用文章都會有所收獲,下面我們一起來看看吧。

Swarm是Docker公司推出的用來管理docker集群的平臺,幾乎全部用GO語言來完成的開發(fā)的, 它是將一群Docker宿主機(jī)變成一個單一的虛擬主機(jī),Swarm使用標(biāo)準(zhǔn)的Docker API接口作為其前端的訪問入口,換言之,各種形式的Docker

Client(compose,docker-py等)均可以直接與Swarm通信,甚至Docker本身都可以很容易的與Swarm集成,這大大方便了用戶將原本基于單節(jié)點的系統(tǒng)移植到Swarm上,同時Swarm內(nèi)置了對Docker網(wǎng)絡(luò)插件的支持,用戶也很容易的部署跨主機(jī)的容器集群服務(wù)。

Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個服務(wù)器或主機(jī)上創(chuàng)建多個容器的工具,而 Docker Swarm 則可以在多個服務(wù)器或主機(jī)上創(chuàng)建容器集群服務(wù),對于微服務(wù)的部署,顯然 Docker Swarm 會更加適合。

從 Docker 1.12.0 版本開始,Docker Swarm 已經(jīng)包含在 Docker 引擎中(docker swarm),并且已經(jīng)內(nèi)置了服務(wù)發(fā)現(xiàn)工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進(jìn)行服務(wù)發(fā)現(xiàn)配置了。

n只是一個調(diào)度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受Docker客戶端發(fā)來的請求,調(diào)度適合的節(jié)點來運行容器,這就意味著,即使Swarm由于某些原因掛掉了,集群中的節(jié)點也會照常運行,放Swarm重新恢復(fù)運行之后,他會收集重建集群信息。

Docker的引擎Swarm怎么用

技術(shù)概要

如果把 Docker 詳細(xì)而又好用的文檔照搬到這里那將太丟人了,所以我將簡要概括下這個技術(shù)的概要。我們已經(jīng)有了 Docker,對吧?,F(xiàn)在,你想要更多的服務(wù)器作為 Docker 主機(jī),但同時你希望它們屬于同一個邏輯上的實體。也就是說,你想建立一個集群。 Docker的引擎Swarm怎么用 

我們先從一個主機(jī)組成的集群開始。當(dāng)你在一個主機(jī)上初始化一個 Swarm 集群,這臺主機(jī)將成為這個集群的管理者manager。從技術(shù)角度來講,它成為了共識組consensus group中的一個節(jié)點node。其背后的數(shù)學(xué)邏輯建立在 Raft 算法之上。管理者manager負(fù)責(zé)調(diào)度任務(wù)。而具體的任務(wù)則會委任給各個加入了 Swarm 集群的工作者worker節(jié)點。這些操作將由 Node API 所管理。雖說我討厭 API 這個詞匯,但我必須在這里用到它。

Service API 是這個實現(xiàn)中的第二個組件。它允許管理者manager節(jié)點在所有的 Swarm 集群節(jié)點上創(chuàng)建一個分布式的服務(wù)。這個服務(wù)可以被復(fù)制replicated,也就是說它們(LCTT 譯注:指這些服務(wù))會由平衡機(jī)制被分配到集群中(LCTT 譯注:指 replicated 模式,多個容器實例將會自動調(diào)度任務(wù)到集群中的一些滿足條件的節(jié)點),或者可以分配給全局(LCTT 譯注:指 global 模式),也就是說每個節(jié)點都會運行一個容器實例。

配置鏡像和服務(wù)

我將嘗試配置一個負(fù)載均衡的 Apache 服務(wù),并使用多個容器實例通過唯一的 IP 地址提供頁面內(nèi)容。挺標(biāo)準(zhǔn)的吧(LCTT 譯注:指這個負(fù)載均衡的網(wǎng)頁服務(wù)器)。這個例子同時也突出了你想要使用集群的大多數(shù)原因:可用性、冗余、橫向擴(kuò)展以及性能。當(dāng)然,你同時需要考慮網(wǎng)絡(luò)和儲存這兩塊,但它們超出了這篇指南所涉及的范圍了。

這個 Dockerfile 模板其實可以在官方鏡像倉庫里的 httpd 下找到。你只需一個最簡單的設(shè)置來起步。至于如何下載或創(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怎么用

Image created

在你繼續(xù)下面的步驟之前,你應(yīng)該確保你能無錯誤的啟動一個容器實例并能鏈接到這個網(wǎng)頁服務(wù)器上(LCTT 譯注:使用下面的命令)。一旦你確保你能連上,我們就可以開始著手創(chuàng)建一個分布式的服務(wù)。

docker run -dit --name my-running-app my-apache2

將這個 IP 地址輸入瀏覽器,看看會出現(xiàn)什么。

Swarm 初始化和配置

下一步就是啟動 Swarm 集群了。你將需要這些最基礎(chǔ)的命令來開始,它們與 Docker 博客中的例子非常相似:

docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest

這里我們做了什么?我們創(chuàng)建了一個叫做 frontent 的服務(wù),它有五個容器實例。同時我們還將主機(jī)的 80 端口和這些容器的 80 端口相綁定。我們將使用剛剛新創(chuàng)建的 Apache 鏡像來做這個測試。然而,當(dāng)你在自己的電腦上直接鍵入上面的指令時,你將看到下面的錯誤:

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.

這意味著你沒有將你的主機(jī)(節(jié)點)配置成一個 Swarm 管理者manager。你可以在這臺主機(jī)上初始化 Swarm 集群或是讓它加入一個現(xiàn)有的集群。由于我們目前還沒有一個現(xiàn)成的集群,我們將初始化它(LCTT 譯注:指初始化 Swarm 集群并使當(dāng)前節(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 并按照指示操作。

操作后的輸出不用解釋已經(jīng)很清楚明了。我們成功的創(chuàng)建了一個 Swarm 集群。新的節(jié)點們將需要正確的令牌token來加入這個 Swarm 集群。如果你需要配置防火墻,你還需找到它的 IP 地址和端口(LCTT 譯注:指 Docker 的 Swarm 模式通訊所需的端口,默認(rèn) 2377)。此外,你還可以向 Swarm 集群中添加管理者節(jié)點?,F(xiàn)在,重新執(zhí)行剛剛的服務(wù)創(chuàng)建指令:

docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
6lrx1vhxsar2i50is8arh5ud1

測試連通性

現(xiàn)在,我們來驗證下我們的服務(wù)是否真的工作了。從某些方面講,這很像我們在 Vagrant 和 coreOS 中做的事情那樣。畢竟它們的原理幾乎相同。相同指導(dǎo)思想的不同實現(xiàn)罷了(LCTT 譯注:筆者觀點,無法茍同)。首先需要確保 docker ps 能夠給出正確的輸出。你應(yīng)該能看到所創(chuàng)建服務(wù)的多個容器副本。

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ī)的端口,它們都能正常工作。對于你如何連接服務(wù)器和收取請求你將會有很多可配置的余地。你可以使用 localhost 或者 Docker 網(wǎng)絡(luò)接口(筆者注:應(yīng)該是指 Docker 的默認(rèn)網(wǎng)橋 docker0,其網(wǎng)關(guān)為 172.17.0.1) 的 IP 地址的正確端口去訪問。下面的例子使用了端口 1080: Docker的引擎Swarm怎么用

Replicated Web service works

至此,這是一個非常粗略、簡單的開始。真正的挑戰(zhàn)是創(chuàng)建一個優(yōu)化過的、可擴(kuò)展的服務(wù),但是它們需要一個準(zhǔn)確的技術(shù)用例。此外,你還會用到 docker info 和 docker service(還有 inspect 和 ps)命令來詳細(xì)了解你的集群是如何工作的。

可能會遇到的問題

你可能會在把玩 Docker 和 Swarm 時遇到一些小的問題(也許沒那么?。?。比如 SELinux 也許會抱怨你正在執(zhí)行一些非法的操作(LCTT 譯注:指在強(qiáng)制訪問控制策略中沒有權(quán)限的操作)。然而,這些錯誤和警告應(yīng)該不會對你造成太多阻礙。 Docker的引擎Swarm怎么用

SELinux alert

  • docker service 不是一條命令(docker service is not a docker command)當(dāng)你嘗試執(zhí)行必須的命令去創(chuàng)建一個復(fù)制模式replicated的服務(wù)時,你可能會遇到一條錯誤說 docker: ‘service’ is not a docker command(LCTT 譯注:見下面的例子)。這表示你的 Docker 版本不對(使用 -v 選項來檢查)。我們將在將來的教程討論如何修復(fù)這個問題。

    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

    關(guān)于這個錯誤已經(jīng)有多個相關(guān)的討論和帖子了。其實這個錯誤也許相當(dāng)無辜。你也許是從瀏覽器粘貼的命令,在瀏覽器中的橫線也許沒被正確解析(筆者注:應(yīng)該用 –name 而不是 -name)。就是這么簡單的原因所導(dǎo)致的。

關(guān)于“Docker的引擎Swarm怎么用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Docker的引擎Swarm怎么用”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI