您好,登錄后才能下訂單哦!
這篇文章主要介紹了Docker的引擎Swarm怎么用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Docker的引擎Swarm怎么用文章都會有所收獲,下面我們一起來看看吧。
Swarm是Docker公司推出的用來管理docker集群的平臺,幾乎全部用GO語言來完成的開發的, 它是將一群Docker宿主機變成一個單一的虛擬主機,Swarm使用標準的Docker API接口作為其前端的訪問入口,換言之,各種形式的Docker
Client(compose,docker-py等)均可以直接與Swarm通信,甚至Docker本身都可以很容易的與Swarm集成,這大大方便了用戶將原本基于單節點的系統移植到Swarm上,同時Swarm內置了對Docker網絡插件的支持,用戶也很容易的部署跨主機的容器集群服務。
Docker Swarm 和 Docker Compose 一樣,都是 Docker 官方容器編排項目,但不同的是,Docker Compose 是一個在單個服務器或主機上創建多個容器的工具,而 Docker Swarm 則可以在多個服務器或主機上創建容器集群服務,對于微服務的部署,顯然 Docker Swarm 會更加適合。
從 Docker 1.12.0 版本開始,Docker Swarm 已經包含在 Docker 引擎中(docker swarm),并且已經內置了服務發現工具,我們就不需要像之前一樣,再配置 Etcd 或者 Consul 來進行服務發現配置了。
n只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受Docker客戶端發來的請求,調度適合的節點來運行容器,這就意味著,即使Swarm由于某些原因掛掉了,集群中的節點也會照常運行,放Swarm重新恢復運行之后,他會收集重建集群信息。
如果把 Docker 詳細而又好用的文檔照搬到這里那將太丟人了,所以我將簡要概括下這個技術的概要。我們已經有了 Docker,對吧。現在,你想要更多的服務器作為 Docker 主機,但同時你希望它們屬于同一個邏輯上的實體。也就是說,你想建立一個集群。
我們先從一個主機組成的集群開始。當你在一個主機上初始化一個 Swarm 集群,這臺主機將成為這個集群的管理者manager。從技術角度來講,它成為了共識組consensus group中的一個節點node。其背后的數學邏輯建立在 Raft 算法之上。管理者manager負責調度任務。而具體的任務則會委任給各個加入了 Swarm 集群的工作者worker節點。這些操作將由 Node API 所管理。雖說我討厭 API 這個詞匯,但我必須在這里用到它。
Service API 是這個實現中的第二個組件。它允許管理者manager節點在所有的 Swarm 集群節點上創建一個分布式的服務。這個服務可以被復制replicated,也就是說它們(LCTT 譯注:指這些服務)會由平衡機制被分配到集群中(LCTT 譯注:指 replicated 模式,多個容器實例將會自動調度任務到集群中的一些滿足條件的節點),或者可以分配給全局(LCTT 譯注:指 global 模式),也就是說每個節點都會運行一個容器實例。
我將嘗試配置一個負載均衡的 Apache 服務,并使用多個容器實例通過唯一的 IP 地址提供頁面內容。挺標準的吧(LCTT 譯注:指這個負載均衡的網頁服務器)。這個例子同時也突出了你想要使用集群的大多數原因:可用性、冗余、橫向擴展以及性能。當然,你同時需要考慮網絡和儲存這兩塊,但它們超出了這篇指南所涉及的范圍了。
這個 Dockerfile 模板其實可以在官方鏡像倉庫里的 httpd 下找到。你只需一個最簡單的設置來起步。至于如何下載或創建自己的鏡像,請參考我的入門指南,鏈接可以在這篇教程的頂部可以找到。
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/ ...
Image created
在你繼續下面的步驟之前,你應該確保你能無錯誤的啟動一個容器實例并能鏈接到這個網頁服務器上(LCTT 譯注:使用下面的命令)。一旦你確保你能連上,我們就可以開始著手創建一個分布式的服務。
docker run -dit --name my-running-app my-apache2
將這個 IP 地址輸入瀏覽器,看看會出現什么。
下一步就是啟動 Swarm 集群了。你將需要這些最基礎的命令來開始,它們與 Docker 博客中的例子非常相似:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest
這里我們做了什么?我們創建了一個叫做 frontent 的服務,它有五個容器實例。同時我們還將主機的 80 端口和這些容器的 80 端口相綁定。我們將使用剛剛新創建的 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.
這意味著你沒有將你的主機(節點)配置成一個 Swarm 管理者manager。你可以在這臺主機上初始化 Swarm 集群或是讓它加入一個現有的集群。由于我們目前還沒有一個現成的集群,我們將初始化它(LCTT 譯注:指初始化 Swarm 集群并使當前節點成為 manager):
docker swarm init Swarm initialized: current node (dm58mmsczqemiikazbfyfwqpd) is now a manager.
為了向這個 Swarm 集群添加一個工作者worker,請執行下面的指令:
docker swarm join \ --token SWMTKN-1-4ofd46a2nfyvrqwu8w5oeetukrbylyznxla 9srf9vxkxysj4p8-eu5d68pu5f1ci66s7w4wjps1u \ 10.0.2.15:2377
為了向這個 Swarm 集群添加一個管理者manager,請執行 docker swarm join-token manager 并按照指示操作。
操作后的輸出不用解釋已經很清楚明了。我們成功的創建了一個 Swarm 集群。新的節點們將需要正確的令牌token來加入這個 Swarm 集群。如果你需要配置防火墻,你還需找到它的 IP 地址和端口(LCTT 譯注:指 Docker 的 Swarm 模式通訊所需的端口,默認 2377)。此外,你還可以向 Swarm 集群中添加管理者節點。現在,重新執行剛剛的服務創建指令:
docker service create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest 6lrx1vhxsar2i50is8arh5ud1
現在,我們來驗證下我們的服務是否真的工作了。從某些方面講,這很像我們在 Vagrant 和 coreOS 中做的事情那樣。畢竟它們的原理幾乎相同。相同指導思想的不同實現罷了(LCTT 譯注:筆者觀點,無法茍同)。首先需要確保 docker ps 能夠給出正確的輸出。你應該能看到所創建服務的多個容器副本。
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
我也測試了不同的、非常規的端口,它們都能正常工作。對于你如何連接服務器和收取請求你將會有很多可配置的余地。你可以使用 localhost 或者 Docker 網絡接口(筆者注:應該是指 Docker 的默認網橋 docker0,其網關為 172.17.0.1) 的 IP 地址的正確端口去訪問。下面的例子使用了端口 1080:
Replicated Web service works
至此,這是一個非常粗略、簡單的開始。真正的挑戰是創建一個優化過的、可擴展的服務,但是它們需要一個準確的技術用例。此外,你還會用到 docker info 和 docker service(還有 inspect 和 ps)命令來詳細了解你的集群是如何工作的。
你可能會在把玩 Docker 和 Swarm 時遇到一些小的問題(也許沒那么小)。比如 SELinux 也許會抱怨你正在執行一些非法的操作(LCTT 譯注:指在強制訪問控制策略中沒有權限的操作)。然而,這些錯誤和警告應該不會對你造成太多阻礙。
SELinux alert
docker service 不是一條命令(docker service is not a docker command)當你嘗試執行必須的命令去創建一個復制模式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)。就是這么簡單的原因所導致的。
關于“Docker的引擎Swarm怎么用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Docker的引擎Swarm怎么用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。