Docker Swarm是Docker官方提供的集羣工具。它能夠將一些關聯的Docker主機轉變成一個虛擬Docker主機。由於Docker Swarm符合Docker API的標準,任何已經能夠與Docker守護進程通訊的工具均可以使用Swarm來透明地擴展到多個主機。支持工具包括:node
Dokku程序員
Docker Composedocker
Docker Machineshell
Jenkinsbootstrap
固然,Docker客戶端自己也是被支持的,而Docker Swarm支持的工具還不止這些。
如同其餘的Docker項目,Docker Swarm依然遵循着「swap, plug, and play」的原則。segmentfault
建立一個Swarm集羣的第一步是從網上拉取Docker Swarm鏡像。而後,你可使用Docker配置Swarm manager和全部節點運行Docker Swarm。步驟:windows
在每一個節點上打開一個TCP端口用於跟Swarm manager通訊後端
在每一個節點上安裝Dockerapi
建立和管理TLS證書以保護集羣ssh
對於有經驗的管理員或者程序員來講,手動安裝Docker Swarm的方法是最好的。另外也能夠用docker-machine來安裝。使用Docker Machine能夠快速的在雲供應商或者你本身的數據中心安裝Docker Swarm。若是你的本地主機已經安裝了虛擬機,那麼你能夠在本地環境中使用Docker Machine快速的構建和瀏覽Docker Swarm。這種方法會自動生成證書以保護你的集羣。
若是是第一次使用Swarm,官方建議先使用Docker Machine。這裏的Docker Machine是Docker官方提供的Docker Toolbox中的工具之一,主要適用於Mac和Windows系統。而本人此次學習是使用的Ubuntu系統和Ubuntu Server系統,因此這裏我沒有用此方法,想要了解此法請參照官方指南。
使用Docker Swarm的發現服務功能(Discovery services)能夠動態的配置和管理容器的服務。想要了解更多關於Discovery services的信息請參照官方文檔。
還有一些其餘的相關信息:如Docker Swarm API和Advanced Scheduling(包含Docker Swarm strategies和Swarm filters)
安裝Docker Swarm有兩種方式:
直接以swarm爲鏡像模板啓動容器;
在系統中安裝swarm的二進制可執行文件。
官網也列舉出了這兩種方法的優缺點:
以swarm鏡像啓動容器:
無需在系統中安裝可執行的二進制文件;
用docker run命令每次均可以獲取並運行最近版本的鏡像;
容器是Swarm與主機環境相隔離,無需維護shell的路徑和環境。
在系統中安裝swarm:
Swarm項目的開發者在測試代碼變動的過程當中,無需在運行該二進制文件前進行容器化(「containerizing」)操做。
所以,官方的推薦的方式也是以Swarm鏡像啓動容器的方式,並且官方給出的指導文檔也都是採用的此種方法。
關於Swarm集羣的構建,官方依然給了兩種
Mac或Windows系統在虛擬機中運行Docker Swarm(Evaluate Swarm in a sandbox)
Linux系統中運行Docker Swarm(Build a Swarm cluster for production)
由於習慣了Hyper-v,若是要使用第一種方法必需要替換爲Oracle VM VirtualBox(點擊瞭解更多),這裏計劃是用Hyper-v建立虛擬機,而後安裝Ubuntu Server系統,而後對第二種方法進行實踐。這裏只簡單提一下第一種方法的步驟
安裝Docker Toolbox(Install Docker Toolbox);
建立三個虛擬機運行Docker Engine(Create three VMs running Docker Engine);
建立一個Swarm發現服務的token(Create a Swarm discovery token);
建立Swarm的管理者和節點(Create the Swarm manager and nodes);
管理Swarm(Manage your Swarm);
每一步的具體操做請參考Docker的官方文檔。
下面主要演示Docker Swarm在Linux系統中的使用,而官方文檔中用到的是AWS(Amazon Web Services)平臺,這裏咱們有選擇性的參照官方文檔繼續本身的操做。本次示例中用到了5個host,那麼這裏就建立5個虛擬機。
在這裏個人
Docker01 和 Docker02 分別對應 manager0 和 manager1;
Docker04 和 Docker05 分別對應 node0 和 node1;
Docker03 對應 consul0;
配置環境;
這裏的配置環境主要是使用私有倉庫的配置和使用,請參照文章:批量上傳鏡像到私有倉庫
# 在客戶端主機建立文件夾(DomainName:Port例如example.com:9527) mkdir -p /etc/docker/certs.d/DomainName:Port # 先將ca.crt文件傳到客戶端主機 # 在ca.crt的當前目錄下將該證書複製到上面建立的文件夾 cp ca.crt /etc/docker/certs.d/DomainName:Port/ # 重啓docker服務 service docker restart # 接下來就能夠從私有倉庫拉取鏡像或向其上傳鏡像了。
創建了一個發現服務的後端;
在這裏,你須要建立一個及其簡單的發現服務的後臺,Swarm集羣的管理者和節點經過這個後臺進行身份驗證,從而成爲集羣的一員。Swarm集羣的管理者也會利用這些信息去判斷哪些節點可以運行容器。爲了簡單起見,您要在同一主機Swarm集羣的管理者主機上運行一個consul守護進程。
# 操做對象manager0和consul0 # 命令 docker run -d -p 8500:8500 --name=consul swarm/consul -server -bootstrap
建立Swarm集羣;
在建立完成發現服務的後臺以後就能夠開始建立集羣的管理者了。接下來會建立兩個Swarm集羣的管理者,第一個啓動的管理者將會成爲Swarm集羣的主管理者(primary manager)。也有文章稱其爲master,但那種說法已經被廢棄。第二個啓動的管理者能夠看做是備胎(replica),一旦主管理者掛掉,那麼備胎將升級爲主管理者。
# 在高可用的Swarm集羣中建立主管理者 # 操做對象 manager0 和 consul0 # <manager0_ip> 和 <consul_ip>相同 docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500 # 操做對象 manager1 docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager1_ip>:4000 consul://172.30.0.161:8500 # 操做對象 node0 和 node1 docker run -d swarm join --advertise=<node_ip>:2375 consul://<consul_ip>:8500
操做Swarm集羣;
# 獲取集羣的管理者和節點的信息 # 操做對象 manager0 和 consul0 docker -H :4000 info # 在Swarm集羣中運行應用 docker -H :4000 run hello-world # 查詢Swarm集羣的哪一個節點在運行該應用 docker -H :4000 ps
測試Swarm集羣的故障;
# 獲取swarm容器的id或名稱 # 操做對象 manager0 docker ps # 刪除或關閉當前的主管理者 manager0 docker rm -f <id_name> # 建立或啓動Swarm集羣管理者 manager0 docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise <manager0_ip>:4000 consul://<consul_ip>:8500 # 查看該容器的日誌 sudo docker logs <id_name> # 獲取集羣管理者和節點的信息 docker -H :4000 info