Docker Swarm集群实践——部署篇
最新消息
Docker在上周的DockerCon技術大會上發布了1.12版核心產品Docker Engine,最大的新特性是Docker Swarm已經被整合到了Docker Engine里面而不再是一個單獨的工具了,這樣就可以更容易的把多個Docker主機組合成一整個規模更大可靠性更高的邏輯單元。Docker的掌舵者 Adrian Mouat相信這種新的集群模式可以大大增強Docker在相關領域的競爭力。
把Docker Swarm整合進Docker Engine是一個重大改進,但它也只是一個附加功能,你可以只在需要的時候才使用它。你可以用和以前一樣的方式來安裝、運行和升級Docker 1.12,而且它也對已有的容器鏡像和工具向后兼容。
以上是關于Swarm的最新發展,你可以深切的感受到開源力量對一個技術的快速迭代,相比較一個公司使用激勵機制提高員工的積極性,開源的思想讓那些有共同理想的技術天才共同協作,為科技的發展提供動力。一點感慨而已!
當然,我們先了解一下現在Swarm的狀況,對學習未來的Swarm還是很有幫助的。
Swarm 簡介
Swarm是Docker公司在2014年12月初新發布的容器管理工具。和Swarm一起發布的Docker管理工具還有Machine以及Compose。Swarm是一套較為簡單的工具,用以管理Docker集群,使得Docker集群暴露給用戶時相當于一個虛擬的整體。Swarm使用標準的Docker API接口作為其前端訪問入口,換言之,各種形式的Docker Client均可以直接與Swarm通信
Swarm架構
Swarm作為一個管理Docker集群的工具,首先需要將其部署起來,可以單獨將Swarm部署于一個節點。另外,自然需要一個Docker集群,集群上每一個節點均安裝有Docker。具體的Swarm架構圖可以參照下圖:
Swarm架構中最主要的處理部分自然是Swarm節點,Swarm管理的對象自然是Docker Cluster,Docker Cluster由多個Docker Node組成,而負責給Swarm發送請求的是Docker Client。
Swarm deamon只是一個調度器(Scheduler)加路由器(router),Swarm自己不運行容器,它只是接受docker客戶端發送過來的請求,調度適合的節點來運行容器,這意味著,即使Swarm由于某些原因掛掉了,集群中的節點也會照常運行,當Swarm重新恢復運行之后,它會收集重建集群信息。
Swarm集群部署
部署架構如下
我們有三臺服務器,132機器作為Swarm Server服務器,其他服務器作為Docker集群的子節點。
1、132機器上下載Swarm鏡像
docker pull swarm2、在使用Swarm進行集群管理之前,需要先把準備加入集群的所有的節點的docker deamon的監聽端口修改為0.0.0.0:2375,修改所有參與Swarm集群的服務器的/etc/default/docker,映射容器端口號.
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock" 重啟docker 服務
3、在132機器上申請Swarm的token
root@controller:~# docker run --rm swarm create 88b70a0603a97f3e51be1d83f471a1df 該token是其他機器加入集群的憑證,需要記錄。
原則上Swarm Server132機器是無需運行容器的,當然,我們為了保證集群數量盡可能多,將132機器也加入進來
root@controller:~# docker run -d swarm join -addr=192.168.12.132:2375 token://88b70a0603a97f3e51be1d83f471a1df 012b3744d4554e7db148b3fb35827e18fec9d12029e7e276707b2eb244dbb47b Swarm的swarm join命令用于將Docker Node添加至Swarm管理的Docker集群中。從這點也可以看出swarm join命令的執行位于Docker Node,因此在Docker Node上運行該命令,首先需要在Docker Node上安裝Swarm,由于該Swarm只會執行swarm join命令,故可以將其當成Docker Node上用于注冊的agent模塊。功能而言,swarm join可以認為是完成Docker Node在Swarm節點處的注冊(register)工作,以便Swarm在執行swarm manage時可以發現該Docker Node。
4、啟動Swarm Manager
Swarm中swarm manage是最為重要的管理命令。一旦swarm manage命令在Swarm節點上被觸發,則說明用戶需要swarm開始管理Docker集群。從運行流程的角度來講,swarm經歷的階段主要有兩點:啟動swarm、接收并處理Docker集群管理請求。
注意的是:在這條命令中,第一:要以daemon的形式運行swarm;第二:端口映射:2376可以更換成任何一個本機沒有占用的端口,一定不能是2375,否則就會出問題。
可見當前只有132機器加入進來了。
Swarm中的swarm list命令用以列舉Docker集群中的Docker Node。Docker Node的信息均來源于Swarm節點上注冊的Docker Node。而一個Docker Node在Swarm節點上注冊,僅僅是注冊了Docker Node的IP地址以及Docker監聽的端口號。
5、同理,我們將133,134機器添加進來
在133機器執行
root@docker1:~# docker run -d swarm join -addr=192.168.12.133:2375 token://88b70a0603a97f3e51be1d83f471a1df e6244ba8f845d87bd9398f9e2d98a0757050bbd8fe1b4d39a827dec84c0bc541在132機器查看節點列表
root@controller:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df 192.168.12.133:2375 192.168.12.132:2375在134機器執行
root@docker2:~# docker run -d swarm join -addr=192.168.12.134:2375 token://88b70a0603a97f3e51be1d83f471a1df c2cf9a779a3b4566f5c199c9b1174a57e87cf800a5b4c37f0545b3af9c993478在132機器查看節點列表
root@controller:~# docker run --rm swarm list token://88b70a0603a97f3e51be1d83f471a1df 192.168.12.134:2375 192.168.12.133:2375 192.168.12.132:2375查看完節點列表,我們也看到了相關docker服務器已經加入到了集群中,但是我們需要查詢一下集群的節點信息
執行docker -H 192.168.12.132:2376 info
我們從中發現一個問題,所含的三個集群子節點只有一個狀態是Healthy,其他都是pending狀態,我們也看到Error 信息:Error: ID duplicated.
這是因為,我在本機的虛擬機來實踐,我的所有機器都是通過同一個機器進行復制,所以導致ID都是一樣,因此報錯,在生產環境應該不會出現該問題。當然,這個問題也可以解決,我們只需要將/etc/docker.key.json文件直接刪除掉,然后重啟一下,系統會新生成一個隨機的key.json文件,也就解決該問題了。
重新執行該命令
root@controller:~# docker -H 192.168.12.132:2376 info Containers: 23Running: 6Paused: 0Stopped: 17 Images: 23 Server Version: swarm/1.2.3 Role: primary Strategy: spread Filters: health, port, containerslots, dependency, affinity, constraint Nodes: 3controller: 192.168.12.132:2375└ ID: CTCC:NH3C:3LID:NMV6:IPEZ:BEXX:GQEH:74GY:RMS6:4MCW:NWOT:MG5Q└ Status: Healthy└ Containers: 12└ Reserved CPUs: 0 / 2└ Reserved Memory: 1 GiB / 2.046 GiB└ Labels: executiondriver=, kernelversion=3.13.0-92-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs└ UpdatedAt: 2016-07-10T07:34:54Z└ ServerVersion: 1.11.2docker1: 192.168.12.133:2375└ ID: MBI4:BY3Z:FOJN:XDLB:6I24:JYKJ:QQKY:MWBS:ZTRI:ATM6:QTDO:7XRR└ Status: Healthy└ Containers: 6└ Reserved CPUs: 0 / 1└ Reserved Memory: 0 B / 1.012 GiB└ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs└ UpdatedAt: 2016-07-10T07:34:31Z└ ServerVersion: 1.11.2docker2: 192.168.12.134:2375└ ID: ZU2Y:GUAK:CMAK:NDMG:HKII:JY3R:7FLM:VM74:5FNJ:X6ON:ZDKM:LQI7└ Status: Healthy└ Containers: 5└ Reserved CPUs: 0 / 2└ Reserved Memory: 0 B / 2.045 GiB└ Labels: executiondriver=, kernelversion=3.13.0-24-generic, operatingsystem=Ubuntu 14.04 LTS, storagedriver=aufs└ UpdatedAt: 2016-07-10T07:34:31Z└ ServerVersion: 1.11.2 Plugins:Volume:Network: Kernel Version: 3.13.0-92-generic Operating System: linux Architecture: amd64 CPUs: 5 Total Memory: 5.103 GiB Name: c8714a5864d1 Docker Root Dir: Debug mode (client): false Debug mode (server): false WARNING: No kernel memory limit support至此,Swarm集群部署完畢!
還記得上次我們在介紹SuperMap iCloudManager 8C 新特性,已經支持Docker了,當時只是在Docker單機進行的操作。
?SuperMap iCloudManager 8C Sp2新特性——擁抱Docker容器支持
http://blog.csdn.net/chinagissoft/article/details/51545904
現如今,我們已經搭建了Swarm集群,我們就在集群環境下試用一下iCloudManager。
根據上述描述我們可以看到,三臺Docker集群總共的計算資源(2CPU+2G RAM,1CPU+1G RAM,2CPU+2G RAM),總共5CPU+5G RAM.
首先,我們在配置初始化的時候,需要輸入Swarm Manager的IP和端口號(2376)而不是2375,因為2375代表132機器的信息,2376代表集群的整體信息。
同時,我們可以可以在首頁看到整體的資源信息
我們創建個新的iServer實例后可以看到,已經創建在132機器上了。
root@controller:~# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3d73f706d1ba 322cacd8b1ca "/bin/sh -c /opt/run." 15 minutes ago Up 14 minutes 0.0.0.0:51237->809 0/tcp sm_iserver-51237 c38dd3d3e671 322cacd8b1ca "/bin/sh -c /opt/run." 16 minutes ago Up 16 minutes 0.0.0.0:53796->809 0/tcp sm_iserver-53796 c8714a5864d1 swarm "/swarm manage token:" 55 minutes ago Up 55 minutes 0.0.0.0:2376->2375 /tcp sick_lichterman f099c42cc02f swarm "/swarm join -addr=19" 55 minutes ago Up 55 minutes 2375/tcp evil_lovelace 201248c1e82a swarm "/swarm manage token:" 21 hours ago Exited (2) 20 hours ago hopeful_albattani cdac07b03439 swarm "/swarm join -addr=19" 21 hours ago Exited (2) 20 hours ago focused_kirch e8295720300b swarm "/swarm manage token:" 39 hours ago Exited (2) 38 hours ago adoring_mayer dd6e3154ea6c supermap/icloudmanager:c802 "/bin/sh -c /etc/iclo" 41 hours ago Up 39 minutes 0.0.0.0:8080->8080 /tcp root_icloudmanager_1 6b22dd275262 zabbix/zabbix-3.0:3.0.0 "/config/bootstrap.sh" 41 hours ago Up 39 minutes 0.0.0.0:80->80/tcp , 0.0.0.0:10051->10051/tcp, 162/udp, 10052/tcp root_zabbix-server_1 d3c0d9431c28 zabbix/zabbix-db-mariadb "/run.sh" 41 hours ago Up 39 minutes 0.0.0.0:3306->3306 /tcp root_zabbix-db_1 012b3744d455 swarm "/swarm join -addr=19" 42 hours ago Exited (2) 38 hours ago condescending_dijkstra 47b06d6ef5e1 registry:2.3.0 "/bin/registry /etc/d" 46 hours ago Up 57 minutes 0.0.0.0:5000->5000 /tcp registry注意:通過Swarm 集群盡量與Docker Registry進行配合使用,也就是iCM的鏡像使用倉庫里面的鏡像,然后通過iCM創建實例的時候,就可以快速pull過來。
接下來我們之間通過命令行來創建容器實例,
執行如下命令:docker -H 192.168.12.132:2376 ?run -id --name ubuntu ?ubuntu:14.04
root@controller:~# docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04 850f4f774623f970a96d10232899cf94761ab0770b98699cd32bdddf88fa4c6f
如果我們繼續創建ubuntu實例,會報已經有同名的錯誤 root@controller:~# docker -H 192.168.12.132:2376 run -id --name ubuntu ubuntu:14.04 docker: Error response from daemon: Conflict: The name ubuntu is already assigned. You have to delete (or rename) that container to be able to assign ubuntu to a container again.. See 'docker run --help'.
但是這個錯誤應該跟調度有關系,同一集群同一個節點內不應該有同樣的實例名,但是同一集群不同的節點應該可以有同樣的實例名,接下來我們就看看關于Swarm集群的調度以及過濾機制
接下來我們就針對Docker Swarm的集群進行操作,包括SuperMap iCloudManager在Swarm集群的操作。
總結
以上是生活随笔為你收集整理的Docker Swarm集群实践——部署篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4-2 webpack使用mapsour
- 下一篇: QQ特殊字符制作方式