Docker入门系列(四):让你的服务跨越多台机器

准备工作

介绍

第三节中,我们使用了第二节写的应用,并定义了它在线上的运行方式,然后启动了5个实例。

在这一节中,我们将这个应用部署到多机集群中,正式步入swarm模式,多机、多容器的应用。

理解 Swarm clusters

Swarm是什么?Swarm就是一组运行docker的机器,并联合成为一个集群。当启动Swarm集群之后,docker命令会通过Swarm manager执行在整个集群之上。Swarm集群的机器可以是物理机,也可以是虚拟机,当加入Swarm集群之后,被称为nodes

Swarm managers有两种不同的方式运行container:第一种emptiest node,尽量使用少的机器部署容器;第二种global,确保每一台机器上都会运行一个容器的实例。可以在docker-compose.yml中指定运行的模式。

Swarm managers是集群的核心控制节点,它负责执行命令,授权新机器加入集群。Worker节点只负责提供资源。

到目前为止,你已经学会在单机使用docker容器。docker可以很方便的切换为 swarm mode,切换的命令是docker swarm init,一旦切换为 swarm mode后,当前的机器角色就变为Swarm managers。

设置你的swarm集群

创建cluster

在本机上使用VM创建集群,我使用的Mac操作系统,接下来演示在Mac上创建swarm集群。

首先,需要安装虚拟机,在Mac上需要下载 Oracle VirtualBox

使用docker-machine创建多个虚拟机

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

使用docker-machine ls列出所有的虚拟机

$ docker-machine ls

NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS

myvm1 - virtualbox Running tcp://192.168.99.100:2376 v17.09.0-ce

myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.09.0-ce

接下来,开始初始化swarm,将myvm1设置为manager,并向集群中加入节点。

1
2
3
4
5
6
7
8
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100:2376"
Swarm initialized: current node (gxhg37symzvlve65jgg9ya984) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-07zo0vcw3uch6r47b3b8rpcqcqz00sa9679s3jil660cimyb72-8t8nfbynnphl2zw8str5efm47 192.168.99.100:2376
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

添加worker节点

1
2
3
$ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-07zo0vcw3uch6r47b3b8rpcqcqz00sa9679
s3jil660cimyb72-8t8nfbynnphl2zw8str5efm47 192.168.99.100:2377"`

2377 vs 2376

注意docker swarm initdocker swarm join运行的端口号是2377,或者不指定端口,使用默认端口。docker-machine ls返回的端口是2376,这个端口是docker deamon的端口。

swarm manager上执行docker node ls检查集群运行情况

1
2
3
4
$ docker-machine ssh myvm1 "docker node ls"
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
gxhg37symzvlve65jgg9ya984 * myvm1 Ready Active Leader
qcbxu2hop7nf13ktzxfg36ein myvm2 Ready Active

如果看到以上输出信息,恭喜你,你已经启动成功。

使用docker swarm leave推出swarm集群

1
2
$ docker-machine ssh myvm2 "docker swarm leave"
Node left the swarm.

部署service到swarm cluster

当此最复杂的部分已经学习完,接下来重复在第三节的操纵,把service部署到集群中。记住,只有swarm manager也就是myvm1可以执行docker命令。每一次连上swarm manager都需要执行docker-machine ssh比较麻烦,我们一个使用另外一种替代方案。使用docker-machine env <machine>配置当前shell连接到在虚拟机上的Docker daemon

1
2
3
4
5
6
7
$ docker-machine env myvm1
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/zhangbing/.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)配置当前的shell连接myvm1

1
eval $(docker-machine env myvm1)

执行docker-machine ls验证myvm1生效。

1
2
3
4
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
myvm1 * virtualbox Running tcp://192.168.99.100:2376 v17.09.0-ce
myvm2 - virtualbox Running tcp://192.168.99.101:2376 v17.09.0-ce

可以看到myvm1是active。

接下来,通过swarm manager将服务部署到集群上,

1
2
3
$ docker stack deploy -c docker-compose.yml getstartedlab
Creating network getstartedlab_webnet
Creating service getstartedlab_web

检查服务的启动情况

1
2
3
4
5
6
7
$ docker stack ps getstartedlab
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
j18ii2ij6daf getstartedlab_web.1 username/repo:tag myvm2 Running Preparing 30 seconds ago
oss51cyvy2n0 getstartedlab_web.2 username/repo:tag myvm2 Running Preparing 30 seconds ago
rfvqjkhwxtif getstartedlab_web.3 username/repo:tag myvm1 Running Preparing 30 seconds ago
y0xapfhxopum getstartedlab_web.4 username/repo:tag myvm2 Running Preparing 30 seconds ago
8a4q8rq4jcxs getstartedlab_web.5 username/repo:tag myvm1 Running Preparing 30 seconds ago

清理工作

停止service的命令

docker stack rm getstartedlab

停止swarm manager

docker swarm leave –force

Ok,你已经在生产环境上操作swarm进行服务的上线,扩容,下线的整个过程。

清理宿主机的shell环境

1
eval $(docker-machine env -u)
Comentarios