docker~swarm搭建docker高可用叢集
Swarm概念
Swarm是Docker公司推出的用來管理docker叢集,它將一群Docker宿主機變成一個單一的,虛擬的主機。Swarm使用標準的Docker API介面作為其前端訪問入口,換言之,各種形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接與Swarm通訊。Swarm幾乎全部用go語言來完成開發,Swarm0.2釋出,相比0.1版本,0.2版本增加了一個新的策略來排程叢集中的容器,使得在可用的節點上傳播它們,以及支援更多的Docker命令以及叢集驅動。
Swarm deamon只是一個排程器(Scheduler)加路由器(router),Swarm自己不執行容器,它只是接受docker客戶端傳送過來的請求,排程適合的節點來執行容器,這意味著,即使Swarm由於某些原因掛掉了,叢集中的節點也會照常執行,當Swarm重新恢復執行之後,它會收集重建叢集資訊.
Swarm結構圖
Swarm的基本命令
docker node 用來顯示叢集的節點,預設建立時只有一個節點,當然也就談不上高可用了,可以使用docker node --help來檢視所有node引數
叢集初始化 docker swarm init
當已經被初始化後,就不能重新執行這個操作了,使用docker node ls 來檢視剛建立的叢集
叢集中的管理節點和工作節點功能圖
新增管理節點 docker swarm join
Docker Swarm 命令中還需要新增一些選項:
* join:表明一個新的節點將被新增進 Swarm
* –manager:表明節點的性質(manager vs worker)
* –listen-addr:讓一個新新增的節點可以訪問 Swarm 內的其他節點
* 最後的引數就是第一管理節點的地址(即這一命令將被送到的那個節點)
注意:由於 –auto-accept manager 選項會在 Swarm 初始化的過程中被提供,所以第二管理節點會被自動接受。如果沒有這一選項,那麼第二管理節點需要被第一管理節點手動接受。
$ MANAGER2_IP=$(docker-machine ip manager2) docker-machine ssh manager2 docker swarm join --manager --listen-addr $MANAGER2_IP:2377 $MANAGER1_IP:2377
Swarn部署時使用的指令碼,來自網路
下面是一小段用來建立 Docker 主機並部署 Swarm 的 Shell 指令碼。當然了,管理/工作節點的數字都是可以隨意改動的。
注意:建立兩個管理節點和兩個工作節點,僅僅是用來作示範。在工業生產中,我們可能需要在叢集裡搭建 3 個管理節點和 5 個工作節點。
# Define the number of managers/workers MANAGER=3 WORKER=5 # Create the Docker hosts for i in $(seq 1 $MANAGER); do docker-machine create --driver virtualbox manager$i; done for i in $(seq 1 $WORKER); do docker-machine create --driver virtualbox worker$i; done # Init the swarm docker-machine ssh manager1 docker swarm init --auto-accept manager --auto-accept worker --listen-addr $(docker-machine ip manager1):2377 # Add additional manager(s) for i in $(seq 2 $MANAGER); do docker-machine ssh manager$i docker swarm join --manager --listen-addr $(docker-machine ip manager$i):2377 $(docker-machine ip manager1):2377; done # Add workers for i in $(seq 1 $WORKER); do docker-machine ssh worker$i docker swarm join --listen-addr $(docker-machine ip worker$i):2377 $(docker-machine ip manager1):2377; done
對於上面文章中,只提到了叢集,而沒有談到如何去使用,在建立集群后,服務的部署我們可以用
docker stack deploy -c test.yml test
下面給出自己寫的一個服務,版本3的
version: "3" services: loggerapi: image: logger.api build: context: ./src/Logger.Api dockerfile: Dockerfile ports: - "5000:80" networks: - ingress loggermanager: image: logger.manager build: context: ./src/Logger.Manager dockerfile: Dockerfile ports: - "5050:80" networks: - ingress networks: ingress:
這裡有個服務要注意,服務的名稱一定不能有點,如logger.manager這是錯誤的!
來建立一個服務,同時可以使用docker service來檢視已經執行的服務!
還有一點要注意,yml在進行v3版後,不再支援build,也就是說,你需要先把映象建立好才行!