
部署服务
我们使用 docker service
命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行。
1.新建服务
进入集群管理节点:
docker-machine ssh manager1使用 docker 中国镜像docker search alpinedocker pull registry.docker-cn.com/library/alpine
现在我们在上一节创建的 Swarm 集群中运行一个名为 helloworld 服务。
docker@manager1:~$ docker service create --replicas 1 --name helloworld alpine ping ityouknow.comrwpw7eij4v6h6716jvqvpxbyvoverall progress: 1 out of 1 tasks1/1: running [==================================================>]verify: Service converged
命令解释:
docker service create 命令创建一个服务 --name 服务名称命名为 helloworld --replicas 设置启动的示例数 alpine 指的是使用的镜像名称,ping ityouknow.com指的是容器运行的bash
使用命令 docker service ps helloworld
可以查看服务进展
docker@manager1:~$ docker service ps helloworldID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSrgroe3s9qa53 helloworld.1 alpine:latest worker1 Running Running about a minute ago
使用 docker service ls
来查看当前 Swarm 集群运行的服务。
docker@manager1:~$ docker service lsID NAME MODE REPLICAS IMAGE PORTSyzfmyggfky8c helloworld replicated 0/1 alpine:latest
2.监控集群状态
登录管理节点 manager1
docker-machine ssh manager1
运行 docker service inspect --pretty <SERVICE-ID>
查询服务概要状态,以 helloworld 服务为例:
docker@manager1:~$ docker service inspect --pretty helloworldID: rwpw7eij4v6h6716jvqvpxbyvName: helloworldService Mode: ReplicatedReplicas: 1Placement:UpdateConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0...Rollback order: stop-firstContainerSpec:Image: alpine:latest@sha256:7b848083f93822dd21b0a2f14a110bd99f6efb4b838d499df6d04a49d0debf8bArgs: ping ityouknow.comResources:Endpoint Mode: vip
运行 docker service inspect helloworld
查询服务详细信息, --pretty 格式化输出运行 docker service ps <SERVICE-ID>
查看那个节点正在运行服务:
docker@manager1:~$ docker service ps helloworldNAME IMAGE NODE DESIRED STATE LAST STATEhelloworld.1.8p1vev3fq5zm0mi8g0as41w35 alpine worker1 Running Running 3 minutes
在工作节点查看任务的执行情况
docker-machine ssh worker1
在节点执行docker ps 查看容器的运行状态。
docker@worker1:~$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES96bf5b1d8010 alpine:latest "ping ityouknow.com" 4 minutes ago Up 4 minutes helloworld.1.rgroe3s9qa53lf4u4ky0tzcb8
这样的话,我们在 Swarm 集群中成功的运行了一个 helloworld 服务,根据命令可以看出在 worker1 节点上运行。
3.弹性伸缩实验
我们来做一组实验来感受 Swarm 强大的动态水平扩展特性,首先动态调整服务实例个数。
调整实例个数
增加或者减少服务的节点数
调整 helloworld 的服务实例数为2个
docker service update --replicas 2 helloworld
查看那个节点正在运行服务:
docker service ps helloworldID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSrgroe3s9qa53 helloworld.1 alpine:latest manager1 Running Running 8 minutes agoa61nqrmfhyrl helloworld.2 alpine:latest worker2 Running Running 9 seconds ago
调整 helloworld 的服务实例数为1个
docker service update --replicas 1 helloworld
再次查看节点运行情况:
docker service ps helloworldID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSa61nqrmfhyrl helloworld.2 alpine:latest worker2 Running Running about a minute ago
再次调整 helloworld 的服务实例数为3个
docker service update --replicas 3 helloworldhelloworldoverall progress: 3 out of 3 tasks1/3: running [==================================================>]2/3: running [==================================================>]3/3: running [==================================================>]verify: Service converged
查看节点运行情况:
docker@manager1:~$ docker service ps helloworldID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTSmh7ipjn74o0d helloworld.1 alpine:latest worker2 Running Running 40 seconds ago1w4p9okvz0xw helloworld.2 alpine:latest manager1 Running Running 2 minutes agosnqrbnh4k94y helloworld.3 alpine:latest worker1 Running Running 32 seconds ago
删除集群服务
docker service rm helloworld
4.总结
通过对 Swarm 的学习,强烈感觉到自动化水平扩展的魅力,这样在公司流量爆发的时候,只需要执行一个命令就可以完成实例上线。如果再根据公司的业务流量做自动化控制,那就真正实现了完全自动的动态伸缩。
举个例子,我们可以利用脚本监控公司的业务流量,当流量是某个级别的时候我们启动对应的N个节点数,当流量减少的时候我们也动态的减少服务实例个数,既可以节省公司资源,也不用操心业务爆发被流量击垮。Docker 能发展的这么好还是有原因的,容器化是 DevOps 最重要的一个环节,未来容器化的技术会越来越丰富和完善,智能化运维可期待。
在运行爬虫程序的时候可以使用Docker Swarm搭建分布式爬虫集群




