文中内容摘自Docker官网
提醒:请务必使用root帐号,以免在后面应用系统部署时,发生权限问题。
介绍
前一篇文中介绍的负载均衡是运行在一台计算机上的。此处要介绍的是应用在多台计算机上的运行,以及加入多台计算机到一个称之为蜂群的坞化的集群。
理解蜂群式集群
蜂群是一组运行Docker且加入集群的计算机。你可以在蜂群管理器上执行命令进行管理。在蜂群里的计算机可以是物理机也可以是虚拟机,加入蜂群后,它们被视为节点。
蜂群管理器使用多种运行容器的策略,例如:“最空闲节点” ——用尽可能少的服务器加载容器;“Global”——确保每一个服务器加载指定容器的一个实例。可以通过配置文件指示蜂群管理器使用这些策略。
蜂群管理器是专门用于执行蜂群管理命令,以及对作为“工蜂”而加入蜂群的计算机进行认证。“工蜂”仅仅是提供加载容器的资源,而不负责认证以及告诉其他计算机能做什么不能做什么。
Docker可以被切换到蜂群模式。立即启用蜂群模式,可以使计算机成为蜂群管理器。随后,Docker在蜂群上运行你下的指令,而不仅仅在当前计算机上执行命令。
启动蜂群
通过执行下列命令可以启动蜂群并将当前计算机升级成一个蜂群控制器:
docker swarm init
然后,你可以使用 docker swarm join 语句将其他计算机添加入蜂群。下面我们以虚拟机的形式快速构建建立在两台计算机基础上的蜂群。
创建集群
现在,使用docker-machine命令创建一组虚拟机:
docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2
注:如何安装docker-machine 参考:https://docs.docker.com/machine/install-machine/;如何加速执行docker-machine create指令,可以参考https://segmentfault.com/a/1190000017001848
完成集群创建后,可以使用docker-machine ls指令查看各虚拟机的状态和IP地址:
root@ONE:~$ sudo docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 - virtualbox Running tcp://192.168.99.103:2376 v18.09.0
myvm2 - virtualbox Running tcp://192.168.99.102:2376 v18.09.0
初始化蜂群添加节点
第一台执行执行管理命令加入蜂群的计算机作为管理员,其后加入蜂群的作为工蜂。你可以执行docker-machine ssh命令将myvm1变成蜂群管理员:
root@one:~$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.103"
Swarm initialized: current node (wp37lr3f8stkrctxhikhgou58) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-01q3o8ihej83sznuwymqd6r8xz0nclgqm0q47x6zqe3qyupqw7-ev2idxap6t1i7owv413gluz68 192.168.99.103:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上述192.168.99.103是虚拟机myvm1的实际IP地址。指令反馈信息中的token在后续添加其它管理员的时候使用,也可以通过下列指令获取:
sudo docker-machine ssh myvm1 "docker swarm join-token -q manager"
若要获取添加工蜂用的token,则使用下列语句:
sudo docker-machine ssh myvm1 "docker swarm join-token -q worker"
端口 2377 和 2376
执行docker swarm init 及 docker swarm join 指令使用2377端口号(蜂群管理端口),执行docker-machine ls指令使用2376端口,2376是Docker的守护端口。
使用--native-ssh ssh选项可以向指定计算机发送指令。下面的指令格式可以理解为让计算机machine执行双引号内的命令:
docker-machine --native-ssh ssh <machine> "..."
该命令登录虚拟机后,默认目录为/home/docker。
现在你可以使用 docker swarm join 语句将myvm2作为工蜂加入蜂群,注意,这里的token是worker的token:
sudo docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-01q3o8ihej83sznuwymqd6r8xz0nclgqm0q47x6zqe3qyupqw7-7jpfkstbte1fkzvu7s1zf0ofv 192.168.99.103:2377"
使用 docker node ls 语句可以查看蜂群节点信息:
root@ONE:~$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
wp37lr3f8stkrctxhikhgou58 * myvm1 Ready Active Leader 18.09.0
icmgmmbl9uiehq05bl2l56dld myvm2 Ready Active 18.09.0
如果需要重新开始,可以执行 docker swarm leave --force语句移除每个节点。
在蜂群上部署应用程序
激活管理员
之前,使用docker-machine SSH包装docker命令,以便与虚拟机对话,现在还有另一个渠道,即运行docker-machine env <machine>获取一个可以运行在虚拟机守护进程的命令。此方法允许您使用本地docker-compose.yml文件“远程”部署应用程序,而无需将其复制到任何地方。
键入并运行docker-machine env myvm1(管理员)。
root@ONE:~# docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.101:2376"
export DOCKER_CERT_PATH="/root/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)
复制粘帖并运行最后一行输出的命令
eval $(docker-machine env myvm1)
此时,可以用docker-machine ls命令查看到myvm1处于激活状态(ACTIVE列有个星号*)
root@ONE:/usr/local/docker# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.101:2376 v18.09.1
myvm2 - virtualbox Running tcp://192.168.99.100:2376 v18.09.1
在此时,运行任何docker的<command>命令(docker-machine不属于docker命令),相当于执行docker-machine ssh myvm1 "<command>"。
在管理员上部署应用
首先,可以用第二篇容器里提到的方法下载存放在仓库里的容器,或者也可以在myvm1里新创建一个容器,这里我采用第一种。
docker-machine ssh myvm1 "docker run -p 4000:80 mymole/test:part1"
其次,将第三篇服务中的docker-compose.yml复制到管理员计算机内,这里为myvm1:
docker-machine scp docker-compose.yml myvm1:/home/docker
最后,执行docker stock 指令创建服务:
docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlab"
此时,你可以使用docker stack ps <stackname>命令,查看部署的service信息:
root@ONE:/usr/local/docker# docker-machine ssh myvm1 "docker stack ps getstartedlab"
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
wi0th0h0tf7s getstartedlab_web.1 mymole/test:part1 myvm1 Running Running about a minute ago
q9jlpeho8j0k getstartedlab_web.2 mymole/test:part1 myvm1 Running Running about a minute ago
4h3mdz2tandd getstartedlab_web.3 mymole/test:part1 myvm2 Running Running about a minute ago
7l58b3zoiso4 getstartedlab_web.4 mymole/test:part1 myvm1 Running Running about a minute ago
ystfc70sl4hu getstartedlab_web.5 mymole/test:part1 myvm2 Running Running about a minute ago
从上面的列表可以看出,名为getstartedlab的应用目前在myvm1和myvm2上各自部署了3个和2个任务,每一个任务背后对应着一个容器,每个容器中部署了一个应用。
现在,你可以通过http://192.168.99.101:4000或http://192.168.99.100:4000访问部署的站点。
端口
在启用蜂群模式之前,需要在群节点之间打开以下端口:
1. 用于容器网络发现的端口7946 TCP/UDP。
2. 用于容器入口网络的端口4789 UDP。