在上一篇文章中咱们介绍了如何经过compose来定义并运行一组service(容器),若是是在分布式的应用场景中,一般会有一个集群的概念,即在集群中部署并管理咱们的应用程序。一样的Docker也提供了相应的模式来管理咱们的一组容器,即Swarm Mode。node
从Docker 1.12开始Swarm mode已经内嵌入了Docker引擎中,成为了docker的子命令docker swarm,再也不须要咱们单独去安装Docker Swarm。Swarm使用SwarmKit构建,是Docker引擎内置(原生)的集群管理和编排工具。提供了对Docker容器集群的管理服务。在开始动手实践以前让咱们先来了解几个概念。linux
以前作过度布式开发和部署的小伙伴对节点的概念必定不会陌生。在分布式开发和部署中咱们管一台服务器称为一个节点。一样的在Docker Swarm Mode中也有节点的概念。运行Docker的主机能够主动初始化一个Swarm集群或者加入一个已存在的Swarm集群,这样这个运行Docker的主机就成为一个Swarm集群的节点(node)。git
节点分为管理(manager)节点和工做(worker)节点。web
管理节点用于Swarm集群的管理,工做节点是任务执行节点,管理节点将服务(service)以任务(task)的形式下发至工做节点执行。管理节点默认也做为工做节点。引用docker官网的图片来展现集群中管理节点与工做节点的关系,以下图所示:docker
任务(Task): 是Swarm中最小的调度单位,能够把他理解成一个单一的容器。安全
服务(Services): 是一组任务的集合,服务定义了任务的属性。服务有两种模式:服务器
replicated services: 按照必定规则在各个工做节点上运行指定个数的任务。负载均衡
global services: 每一个工做节点上运行一个任务。分布式
下方来自Docker官网的图片形象的展现了容器,任务,服务的关系, 如图所示:工具
docker内置了docker swarm的相关指令,咱们能够经过docker swarm init来开启swarm集群,以下图所示:
执行docker swarm init命令的节点会自动成为管理节点。
注意: 若是你的docker主机有多个网卡,拥有多个IP,须要在docker swarm init后面加入
--advertise--addr,以指定被监听的ip和port,以便其余节点能够加入到集群中。
这样就建立了一个单节点的集群,咱们能够经过指令docker node ls来查看集群中的节点信息,如图所示:
单节点集群已经建立好,接下来咱们来看如何向集群中部署服务,上篇文章中咱们讲到经过compose file部署启动多个容器,一样在Swarm中咱们也可使用compose文件来配置,启动多个服务。咱们继续使用上节课的docker-compose.yml文件,并在文件中加入一些部署相关的信息,新的文件内容以下图所示:
红色框中是咱们新添加的节点信息:
deploy节点定义了service(包含某个业务功能的镜像或docker容器)的部署策略,replicas表示在docker集群的节点中运行2个服务实例(容器实例),具体在哪些节点运行由docker内部进行分配,limits限制了每一个实例所使用的最大cpus为10%,最大memory为50MB RAM,并设置服务实例的重启机制为一旦某个容器发生故障,则当即重启容器。
如今让咱们在建立的单节点集群中部署这组服务。docker提供了docker stack deploy指令来利用compose文件部署服务,让咱们进入到docker-compose.yml所在的文件夹,并执行以下指令:docker stack deploy -c docker-compose.yml servicestacklab ,结果如图所示:
该指令所表达的意思是经过执行docker-compose.yml文件中的脚原本建立一个名为servicestacklab的stack的服务组。咱们能够经过指令docker stack ls来查看当前swarm中有哪些stack服务组,结果如图所示:
咱们能够看到在当前的swarm中只有一个名为servicestacklab的服务组,而且这个服务组中只有一个service。
咱们能够经过执行docker stack services 指令来查看stack中有哪些服务,执行指令docker stack services servicestacklab,结果如图所示:
service的命名规则为:stackname_servicename, stackname为咱们docker stack deploy中定义的servicestacklab,servicename是咱们compose文件中定义的每个service的name,在该实例的compose文件中咱们只定义了一个名为weblab的service,所以最终的服务名称为servicestacklab_weblab, 能够参照上方compose file内容的截图。
上面咱们提到过,管理节点将服务(service)以任务(task)的形式下发至工做节点执行,在咱们的部署策略中咱们设置的在每一个node中部署一个服务的两个task,那么咱们能够经过指令docker service ps servicename来查看一个服务的task状况,指令为docker service ps servicestacklab_weblab, 结果如图所示:
咱们能够看到在node名为linuxkit-00155d6f91aa的节点上以task的形式运行了两个servicestacklab_weblab服务的实例,task的名为servicestacklab_weblab.1和servicestacklab_weblab.2。
咱们经过docker ps -a指令来查看当前运行的容器实例信息,结果如图所示:
能够看到当前有两个正在运行的容器,你们记住这两个容器实例的ContainerID分别为:
037776ed23d3和9f3fcf0ba7d9
接下来,咱们经过在文件中暴露的5000端口来访问这个服务:http://localhost:5000,在页面中我打印出了当前machine的name(即container的id),咱们多刷新几回页面查看MachineName的变化,获得以下两张图:
能够发现Swarm为咱们实现了服务访问的负载均衡。除了负载均衡以外,Swarm mode还内置了服务发现,路由网格,动态伸缩,滚动更新,安全传输等功能。你们在据说docker的同时也必定据说过Kubernetes,Swarm Mode与Kubernetes相似,K8S也提供了对docker集群管理的相关功能,后期会找时间为你们介绍一下如何经过K8S来管理Docker集群。
本篇文章咱们就介绍到这里,但愿能让你们对Docker的Swarm Mode有必定的了解,下一篇文章会为你们讲解如何在单台机器上实现包含多docker主机的集群,以实现模拟在多docker主机之间的分布式部署。
相关资料:
yeasy.gitbooks.io/docker_prac…