導讀 | Swarm,聽起來像是個龐克搖滾樂團。但它確實是個新的編排機制,抑或者是,一個 Docker 現有編排體制的改進。簡單來講,如果你在用一個舊版的 Docker,你必須手動設定 Swarm 來建立 Docker 叢集。從 1.12 版開始,Docker 引擎整合了一個原生的實作(LCTT 譯註:見下文)來支援無縫的叢集設定。也就是為什麼會有這篇文章。 |
在這篇教學中,我將帶你體驗編排後的 Docker 將能做的事情。這篇文章並不是包含所有細節(如 BnB 一般)或讓你對其全知全能,但它能帶你踏上你的集群之路。在我的帶領下開始吧。
Teaser
技術概要如果把 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 模式),也就是說每個節點都會運行一個容器實例。
此外還有更多的功課要做,但這些資訊已經足夠你上路了。現在,我們開始整些實際的。我們的目標平台是 CentOS 7.2,有趣的是在我寫這篇教學的時候,它的軟體倉庫中只有 1.10 版的 Docker,也就是說我必須手動更新以使用 Swarm。我們將在另一篇教程中討論這個問題。接下來我們還有一個跟進的指南,其中涵蓋瞭如何將新的節點加入我們現有的集群(LCTT 譯註:指剛剛建立的單節點集群),並且我們將使用 Fedora 進行一個非對稱的配置。至此,請確保正確的配置已經就位,並且有一個工作的集群啟動並正在運行(LCTT 譯註:指第一個節點的Docker 已經安裝並已進入Swarm 模式,但到這裡筆者並沒有介紹如何初始化Swarm集群,不過別擔心下章會講)。
配置鏡像和服務我將嘗試設定一個負載平衡的 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 初始化和配置下一步就是啟動 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 6lrx1vhxsar2i50is8arh4ud1测试连通性
现在,我们来验证下我们的服务是否真的工作了。从某些方面讲,这很像我们在 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 create --name frontend --replicas 5 -p 80:80/tcp my-apache2:latest docker: 'service' is not a docker command.
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 等应用提供服务发现),以及当前的 Docker 版本提供的(笔者注:新的 Swarm 集群实现,亦被称为 Docker 引擎的 Swarm 模式)。也就是说,请别偷懒花些时间阅读以下内容:
你總算看到這裡了。到這裡仍然無法保證你學到了什麼,但我相信你還是會覺得這篇文章有些用的。它涵蓋了一些基礎的概念,以及一個Swarm 叢集模式是如何運作的以及它能做什麼的概述,與此同時我們也成功的下載了並創建了我們的網頁伺服器的鏡像,並且在之後基於它運行了多個叢集式的容器實例。雖然我們目前只在單一節點做了以上實驗,但我們將來會解釋清楚(LCTT 譯註:以便解釋清楚多節點的 Swarm 群集操作)。而我們解決了一些常見的問題。
我希望你能認為這篇指南夠有趣。結合我過去所寫的關於 Docker 的文章,這些文章應該能給你一個像樣的解釋,包括:怎麼樣操作鏡像、網路堆疊、儲存、以及現在的叢集。就當熱身吧。的確,請享受並期待在新的 Docker 教程中與你見面。我控幾不住我記幾啊。
祝你愉快。
以上是快速入門 Docker 引擎的 Swarm 模式!的詳細內容。更多資訊請關注PHP中文網其他相關文章!