想要將應用部署在一個集羣並運行在多臺機器上?html
經過將多臺機器連接到「Dockerized"集羣以實現應用程序運行在多容器,多機器的技術被稱爲swarm。node
一個swarm是一組運行docker的機器,它們加入同一個集羣,加入swarm的都被當作一個節點。在集羣下,須要一個swarm manager管理全部機器,執行docker命令和贊成其餘節點加入swarm就是經過這個manager。其他都是workers,它們只提供勞動力,無權告知其餘節點該作什麼或者不能作什麼。web
以前的docker使用都是單主機,這裏將使用虛擬機,嘗試多機器下的swarm模式。redis
一個swarm由一羣節點構成。它的基本思想很簡單: 運行docker swarm init
開啓swarm模式並讓當前機器成爲manager,其餘機器再經過docker swarm join
加入這個swarm當苦力。docker
這裏使用virtualbox建立虛擬機。系統是Mac os X。數據庫
安裝教程地址:bash
使用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 ls
查看運行的虛擬機。active帶*的表明是當前進入的機器。
docker-machine ssh <vmname> "<Command>"
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的意思。
我選擇使用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的方式進入其餘機器照着作就是。
進入manager,也就是這裏的myvm1中,執行docker node ls
,就能夠看到兩臺機器和它們的狀態。
經過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的數量並從新執行部署命令,整個過程服務依然正常,不會中斷。
一個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。執行命令docker stack rm getstartedlab
移除當前stack。
在worker機器,執行docker swarm leave
退出swarm,manager節點只能強制退出docker swarm leave --force
,manager退出後意味着整個swarm不復存在。
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