docker集群部署:第4部分:群集
docker集群部署:第4部分:群集
- 介绍
在第3部分:服务中,介绍了你在第2部分中编写的应用程序,并将其转化为服务,然后在生产过程中将其扩展5倍,从而实现单台服务器多个容器的负载均衡。
在第4部分中,将此应用程序部署到群集上,并在多台服务器上运行它。通过将多台机器连接到名为“Dockerized”的群集,使的多容器,多机器应用成为可能。 - 群集概念
群集(swarm)是运行Docker并加入到一个集群中的一组机器。群体中的服务器可以是物理的或虚拟的。加入群体后,他们被称为节点。
Swarm管理人员可以使用多种策略来运行容器,你可以指示swarm manager(集群管理机)在Compose文件中使用这些策略,就像你已经使用的策略一样。
swarm manager(集群管理机)是群体中唯一可以执行你的命令的机器,或者授权其他机器作为从机加入群体。从机只是在那里提供资源或服务能力,并没有权力告诉任何其他机器可以做什么和不可以做什么。
到目前为止,你已经在本地机器上以单主机模式使用Docker。但是Docker也可以切换到群集模式,立即启用群模式使当前机器成为swarm manager(集群管理机)。从那时起,Docker将运行你正在管理的群集上执行的命令,而不仅仅是在当前的机器上。 - 建立群集
一个群由多个节点组成,可以是物理机或虚拟机。基本的概念很简单:运行docker swarm init来启用swarm模式,并让你的当前机器成为swarm manager,然后在其他机器上运行docker swarm join让它们作为worker(从机)加入swarm。具体步骤如下: (1)在swarm manager(集群管理机)上执行 #docker swarm init Swarm initialized: current node (udsskjm1xcmwrhnukfu9k3xze) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-2jqmzukum85nfuaipg9gw3zv8jzwv71kx9ls54xazmm6gvpnfm-5y1cwboulbsznmldko99m24od 10.0.0.38:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.说明:在管理机上执行docker swarm init后,系统会产生如上的内容和docker swarm join的信息,但是,如果我们不是立即将从机加入集群中,那么我们应该如何得到这个信息呢?
##执行如下命令: ##在leader主机上运行 #docker swarm join-token manager 返回: To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-67up8rqnbpt7dq83icrgexr7lc5l1dofjcjk8onhjhfv9cit9g-5xacj7evi09tuj2cs9jlj6wjp 10.0.0.38:2377(2)在worker(从机)上执行 #docker swarm join --token SWMTKN-1-2jqmzukum85nfuaipg9gw3zv8jzwv71kx9ls54xazmm6gvpnfm-5y1cwboulbsznmldko99m24od 10.0.0.38:2377 返回:This node joined a swarm as a worker.(3)在swarm manager(集群管理机)上查看集群情况 #docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS udsskjm1xcmwrhnukfu9k3xze * swarm1 Ready Active Leader ybjg2rrdxlg07gh5ouwub8155 swarm2 Ready Active - 离开集群
如果你想重新开始,你可以从每个节点运行docker swarm leave。说明:如果在管理机上执行docker swarm leave,则: #docker swarm leave --force Node left the swarm. [root@swarm1 ~]# docker node ls Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.在从机上运行:docker swarm leave 在主机(manage)上查看: # docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS i0hkvoybv632ajec28fi5h31e * swarm1 Ready Active Leader t8qw0gq2ny3o4uwr3mt8xhgs7 swarm2 Down Active - 在群集上部署应用程序
两台机器分别是swarm1(10.0.0.38)和swarm2 (10.0.0.39)
具体步骤如下:(1)swarm1是主机(manage),在其上执行:docker swarm init (2)swarm2是从机添加进集群中,在其上执行: #docker swarm join --token SWMTKN-1-38m4cy1jwkoi6z9nna8xbvjslksphss635gkgmkr6l0kifryn5-c4ea9yazu2m2ag20j477kxqli 10.0.0.38:2377 (3)在主机(manage)上执行: #docker stack deploy -c docker-compose.yml getstartedlab (4)在主机(manage)上执行:docker stack ps getstartedlab ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS 8uppaqhfm8fg getstartedlab_web.1 friendlyhello:latest swarm1 Running Running 34 seconds ago rx3j05fhyzvg getstartedlab_web.2 friendlyhello:latest swarm2 Running Running 33 seconds ago n6c91tcej3ox getstartedlab_web.3 friendlyhello:latest swarm1 Running Running 34 seconds ago uov66tw8ou4k getstartedlab_web.4 friendlyhello:latest swarm2 Running Running 34 seconds ago 5qlijwxe8obg getstartedlab_web.5 friendlyhello:latest swarm2 Running Running 32 seconds ago 注意:swarm1与swarm2上必须都有镜像friendlyhello:latest - 访问集群
在主机(manage)上执行:curl 10.0.0.38:80
说明:不要使用curl 10.0.0.39:80,执行时会报拒绝连接的错误!你会发现五个容器ID,它们都是随机循环的,展示了负载平衡。如下: <h3>Hello World!</h3><b>Hostname:</b> 931ff909ff35<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>[ <h3>Hello World!</h3><b>Hostname:</b> a39eefe721ed<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>[ 。。。。。。 - 集群上应用程序的更改
通过更改docker-compose.yml文件来更改应用程序。
无论哪种情况,只需docker stack deploy再次运行以部署这些更改即可。
使用docker swarm join将任何物理或虚拟机器加入到此群集,并将这些新添加的机器资源添加到群集中。docker stack deploy随后运行,你的应用程序将利用新的资源。 - 集群清理
你可以拆下堆叠docker stack rm 集群名。例如:执行: #docker stack rm getstartedlab