docker入門3-docker swarm

swarm介紹

想要將應用部署在一個集羣並運行在多臺機器上?html

經過將多臺機器連接到「Dockerized"集羣以實現應用程序運行在多容器,多機器的技術被稱爲swarmnode

一個swarm是一組運行docker的機器,它們加入同一個集羣,加入swarm的都被當作一個節點。在集羣下,須要一個swarm manager管理全部機器,執行docker命令和贊成其餘節點加入swarm就是經過這個manager。其他都是workers,它們只提供勞動力,無權告知其餘節點該作什麼或者不能作什麼。web

以前的docker使用都是單主機,這裏將使用虛擬機,嘗試多機器下的swarm模式。redis

swarm建立

一個swarm由一羣節點構成。它的基本思想很簡單: 運行docker swarm init開啓swarm模式並讓當前機器成爲manager,其餘機器再經過docker swarm join加入這個swarm當苦力。docker

這裏使用virtualbox建立虛擬機。系統是Mac os X。數據庫

安裝virtualbox虛擬機

安裝教程地址:bash

https://www.virtualbox.org/wiki/Downloadsapp

使用docker-machine建立VMs

使用docker桌面版,docker-machine默認安裝。docker-machine不止是方便咱們使用部署虛擬機,也能用於部署對物理機的部署,阿里雲也有相關的驅動,方便在阿里雲上高效部署機器。負載均衡

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

建立兩個虛擬機。這裏`--driver``指定使用virtualbox建立虛擬機,docker-machine會自動使用名爲boot2docker.iso的精簡版Linux鏡像,裏面自帶docker。ssh

docker-machine查看虛擬機

docker-machine ls查看運行的虛擬機。active帶*的表明是當前進入的機器。

docker-machine鏈接虛擬機

直接的方式

docker-machine ssh <vmname> "<Command>"

配置env環境

eval $(docker-machine env <vmname>)

docker-machine env myvm1輸出以下:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/cheny/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"

這些都是導入環境變量的語句,eval執行這個設置環境變量的語句,docker運行時會讀取這些環境變量,以後就會自動將語句發送到相應的機器上執行。

簡而言之就是配置好指向myvm1的環境變量以後,本地執行docker stack deploy -c docker-compose.yml getstartedlab,其實就是在myvm1中執行,並且docker會自動將本地的docker-compose.yml文件應用到myvm1這個機器上,省掉了分發配置文件的步驟。

退出myvm1的方式是eval $(docker-machine env -u)-u就是unset的意思。

虛擬機上建立swram並加入swarm

我選擇使用env的方式,在myvm1上建立節點。不使用env的方式,可使用命令docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>建立。

返回結果是:

Swarm initialized: current node (jbgyylqqg2bxyd2gkml66nqmt) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面明確說明,進入其餘機器,執行docker swarm join --token SWMTKN-1-4m109aavz9wjhqc2rx7qkqyux3cnlvcyhnokhew31jipneer6n-191ckpl6qfq7alp2ggihgvmhs 192.168.99.100:2377加入swarm。經過env的方式進入其餘機器照着作就是。

查看swarm node

進入manager,也就是這裏的myvm1中,執行docker node ls,就能夠看到兩臺機器和它們的狀態。

在swarm中部署app

經過docker-compose.yml文件能夠看到,當前的services只有一個,名字叫web。其實咱們還有redis這個service沒有部署,會在stack章節中補上。

在myvm1這個manager上使用docker stack deploy -c docker-compose.yml getstartedlab部署一個名爲getstartedlab的stack。一個stack下能夠有多個service,但咱們只有一個名爲web的service,它下面有5份container,按照默認的負載均衡策略,這個名爲web的service下面的container可能會分佈在myvm1和myvm2兩臺機器上。

之後全部的部署任務都在myvm1這個manager上執行,它會根據當前swarm下有多少機器自動對部署進行調整,其餘的worker當個苦力就好,執行命令跟worker沒有關係。

要伸縮處理能力,只須要增長或減小swarm中的機器和修改yml文件中replicas的數量並從新執行部署命令,整個過程服務依然正常,不會中斷。

查看stack下的service狀況

docker層次理解

一個swarm下能夠有多個stack,每一個stack都是一個完整的服務,每一個服務都是由一個或多個service構成。這些service多是數據庫,也多是web應用,它們合力合做組成用戶使用的一個完整服務。而每一個service由一到多個container組成,這些container可能分佈在多個機器上,每一個container就是這個分佈式系統上實際的工做單位。這是我對docker層次的理解。

docker stack ps getstartedlab在對docker層次有理解以後,這個查看命令的就明瞭了。它就是查看名爲getstartedlab的stack的詳細狀況。

同理:

  • docker stack ls就是查看有哪些stack在當前swarm中。
  • docker service ls就是查看有哪些service在當前swarm中。
  • docker service ps getstartedlab_web就是指定查看當前swarm中名爲getstartedlab_web的service。這個名稱是自動生成的,表明它是名爲getstartedlab的stack下叫web的service。

清除swarm和stack

執行命令docker stack rm getstartedlab移除當前stack。

在worker機器,執行docker swarm leave退出swarm,manager節點只能強制退出docker swarm leave --force,manager退出後意味着整個swarm不復存在。

docker-machine重啓

docker-machine restart <vmname>重啓機器,經過docker-machine --help,得知還有命令docker-machine start <vmname>啓動機器,docker-machine stop <vmname>,不過它們更適用於本機的虛擬機。

系列導航

docker入門1-docker container
docker入門2-docker service
docker入門4-docker stack

相關文章
相關標籤/搜索