DockerSwarm是Docker开发的容器集群管理服务。从1.12.0版本开始,安装后已经是Docker自带的一部分(捆绑软件),也称为SwarmMode,无需额外安装。与Kubernetes相比,DockerSwarm是一个看似不堪重负的简单软件。但它与docker-compose的兼容性弥补了一切。对于没有集群经验的初学者来说,入手DockerSwarm是一个不错的选择。DockerSwarm的概念主要包括以下几个概念:SwarmNodeStackServiceTaskLoadbalancingSwarm本身就是“swarm”,crowd,蜂群的意思。这里指的是计算机集群(cluster)与Docker连接后的状态。dockerswarm命令可以创建、加入和离开集群。Node是一个计算机节点,也可以认为是一个Docker节点。Node分为两类:Manager和Worker。一个Swarm必须至少有一个Manager,有些管理命令只能在Manager上使用。两种类型的Node都可以运行Service,但是只有Manager可以执行运行命令。比如只有Manager可以使用dockernode命令查看、配置、删除Node。Stack是一组Service,类似于docker-compose。默认情况下,一个Stack共享一个Network,彼此可以访问,并且与其他Stack网络隔离。这个概念只是为了编程方便。dockerstack命令可以很方便的操作一个Stack,而不是一个一个的操作Services。服务是一种容器。对于用户来说,Service是与Swarm交互的核心内容。Service有两种运行模式,一种是replicated,指定一个Service运行多少个容器;另一种是全局的,它在所有满足运行条件的节点上运行一个这样的容器。dockerservice命令可以操作Swarm中的Service。Task是指运行一个容器的任务,它是Swarm执行命令的最小单位。要成功运行一个Service,需要执行一个或多个Task(取决于一个Service的容器数量),以保证每个容器顺利启动。通常用户操作的是服务,而不是任务。负载均衡就是负载均衡,也包括反向代理。Swarm采用Ingress形式的负载均衡,即访问每个节点的一个Published端口,可以自动代理到真实的服务上。一般原理如下图所示。ingressnetworkReplicatedModeservices:some-serivce:...deploy:mode:replicatedreplicas:3默认情况下,模式是复制的,所以这一行可以省略。默认的副本数是1,也就是说这个Service只启动1个容器。这种模式下可以按需启动多个服务,Swarm会自动调整,有时一个Node会启动多个容器。全局模式services:some-serivce:...deploy:mode:globalplacement:...所有可部署节点都已部署。通过放置,可以限制满足条件的节点,避免部署在不合适的节点上。操作下面介绍一些常用的具体操作。创建第一个Nodedockerswarmminit--advertise-addr$IP$IP为当前Node对外访问的IP,方便其他Node寻址。这样就初始化了一个Swarm,它只有一个Manager节点。添加新的Node到Swarm在Manager节点,执行以下命令可查看到如何加入一个Node:$dockerswarmjoin-tokenmanagerToaddamanagertothisswarm,runthefollowingcommand:dockerswarmjoin--tokenSWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-ezs4fylj526e801b3cl0pojr510.174.28.52:2377$dockerswarmjoin-tokenworkerToaddaworkertothisswarm,runthefollowingcommand:dockerswarmjoin--tokenSWMTKN-1-2zspelk468gb6wgw5adea4wlbw4kfy3q1uhr86zpafl9m5a3ho-164iqklrfv8o3t55g088hylyk10.174.28.52:2377在没有加入任何Swarm的机器上,执行上面的命令arm--tokenjowarmernodes成为一个。在Manager节点上设置节点Label,可以为任意节点设置标签:dockernodeupdate$node_name--label-addmain=true$node_name是设置节点的ID或者HOSTNAME。Label是键值对的形式,main=true中的main是键,true是值。Label设置好后,可以在Compose文件中使用placement中的constraints来限制可用的节点。services:some-serivce:...deploy:placement:constraints:-node.labels.main==true...以上配置只允许在Label设置为main=true的节点上使用some-service。启动和停止服务dockerstackdeploy$stack_name-cdocker-compose.yaml-cother.yaml...$stack_name是Stack名称。可以通过-c指定多个docker-compose文件,多个文件可以在同一个Stack下批量部署。这些YAML文件的写法与原来用docker-compose命令执行没有本质区别,只是增加了以下独特的配置,一些Swarm场景不支持的配置会被忽略。推荐使用docker-compose文件来安排Stack,而不是直接用dockerservicecreate手动创建。详细配置项请参考《Compose file version 3 reference | Docker Documentation》。要停止所有Stack服务,请执行以下命令。dockerstackrm$stack_name更新正在运行的服务的镜像dockerserviceupdate--image$image:$tag$service_name
