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