service 只能依附于 docker swarm 集群,所以 service 的创建前提是,swarm 集群搭建完毕。
docker service create
命令用于创建 service,需要在 manager
中运行。与创建容器的命令 docker run 非常类似
目前的节点状态如下:
在 swarm 中创建一个运行 tomcat:8.5.49
镜像的 service,服务名称为 toms,包含3 个副本 task,对外映射端口号为 9000。当一个 service 包含多个 task 时,对 service 的访问最终会通过 <font color=red>负载均衡</font> 方式转发给各个 task 处理。这个负载均衡为轮询策略。
docker service create --name toms --replicas 3 -p 9000:8080 tomcat:8.5.49
docker service ls
命令用于查看当前 swarm 集群中正在运行的 service 列表信息。一个swarm 中可以运行多个 service。
通过 docker service inspect [service name|service ID]
命令可以查看指定 service 的详情。
服务创建完毕后,该服务也就运行了起来。此时就可通过浏览器进行访问了
也可以直接通过ip访问,通过域名访问需要在本机C:\Windows\System32\drivers\etc\hosts
文件中加入如下:
192.168.137.100 docker
192.168.137.101 docker2
192.168.137.102 docker3
192.168.137.103 docker4
192.168.137.104 docker5
docker service ps [service name|service ID]
命令可以查看指定服务的各个 task 所分配的节点信息。
可以看到,toms 服务的 3 个 task 被分配到了 docker2、docker3、docker 三个主机。其中 ID 为task ID
,NAME 为 task 的 name。task name
是 service name
后添加从 1 开始的流水号形成的。
通过 docker node ps [node]
可以查看指定节点中运行的 task 的信息。默认查看的是当前节点的task 信息。
通过 docker service logs
命令可以查看指定 service 或 task 的日志。通过 docker service logs –f
命令可动态监听指定 service 或 task 的日志。
(1)查看 service 日志
通过 docker service logs [service name|service ID]
命令可以查看指定 service 的日志。这些日志实际是所有 task 在节点容器中的运行日志。
# -f 实时进行显示,-t 日志要携带时间戳,-–tail 100 显示最新的100条数据
docker logs -f -t --tail 200 <service name|service ID>
(2)查看 task 日志
通过 docker service logs [task ID]
命令可以查看指定 task 的日志。注意,这里只能指定taskID,不能指定 task name(task name不唯一)。这些日志实际是指定 task 在节点容器中的运行日志。
docker service logs -f -t -n 5 <task ID>
有时候server启动失败,通过logs查看日志什么也没有,可以通过
docker service ps --no-trunc <service>
查看错误信息
在 docker2、docker3、docker 三个主机中查看正在运行的容器列表,可以看到相应的tomcat 容器。
容器的 NAME 是由 task name 后添加 task ID 形成的。在 docker4、docker5 主机中是没有该服务的 task 容器的。
根据访问量的变化,需要在不停止服务的前提下对服务的 task 进行扩容/缩容
,即对服务进行伸缩变化。有两种实现方式:
(1)docker service update 方式
通过 docker service update --replicas
命令可以实现对指定服务的 task 数量进行变更。
docker service update --replicas 5 toms
(2)docker service scale 方式
通过 docker service scale
命令可以为指定的服务变更 task 数量。
# docker service scale SERVICE=REPLICAS
docker service scale toms=7
docker service scale toms=3
(3)暂停节点的 task 分配
生产环境下,可能由于某主机性能不高,在进行 task 扩容时,不想再为该主机再分配更多的 task,此时可通过 pause
暂停该主机节点的可用性来达到此目的。
docker node update --availability pause <nodeID>
更新前有3个task,分别在docker、docker2、docker3节点上,更新副本数为10后,docker2 上边还是只有一个task
(4)清空 task
由于某节点出现了性能问题,需要停止服务进行维修,此时最好是将该节点上的task 清空,以不影响 service 的整体性能。
通过 docker node update –availability drain
命令可以清空指定节点中的所有 task。
docker node update --availability drain <nodeId>
清空前每个节点有一个task,将dcoker3、docker4清空后,docker3、docker4两个节点上没有task了,但是总的toms服务的task总量没有减少。全部都分配到了docker、docker2、docker5三个节点上了,这个结果是由编排器与分发器共同维护的。
当某个 task 所在的主机或容器出现了问题时,manager 的编排器会自动再创建出新的task,然后分发器会再选择出一台 available node 可用节点,并将该节点分配给新的 task。
# 在docker5中
docker ps
docker stop <containerID>
# 在manager节点重新查看服务的task节点信息
docker service ps toms
在docker5中停掉容器后,再查看服务的task节点信息可以看到,原来docker5中的task已经是Shutdown状态了,又新增了一个新的toms.5
的task
通过 docker service rm [service name|service ID]
可以删除指定的一个或多个 service。
删除后,该 service 消失,当然,该 service 的所有 task 也全部删除,task 相关的节点容器全部消失。
当一个 service 的 task 较多时,为了不影响对外提供的服务,在对 service 进行更新时可采用滚动更新方式。
需求:将原本镜像为 tomcat:8.5.49 的 service 的镜像滚动更新为tomcat:8.5.39
docker service create \
--name toms \
--replicas 10 \
--update-parallelism 2 \
--update-delay 3s \
--update-max-failure-ratio 0.2 \
--update-failure-action rollback \
--rollback-parallelism 2 \
--rollback-delay 3s \
--rollback-max-failure-ratio 0.2 \
--rollback-failure-action continue \
-p 9000:8080 \
tomcat:8.5.49
在更新过程中如果更新失败,则会按照设置的回滚策略进行回滚,回滚到更新前的状态。但也可通过命令方式手工回滚。
# 按照前面设置的每次回滚 2 个 task,每次回滚间隔 3 秒进行回滚
docker service update --rollback toms
需要注意,task name 保持未变,但 task ID 与原来的 task ID 也是不同的,并不是恢复到了更新之前的 task ID。即编排器新创建了 task,并由分发器重新为其分配了 node。
在 docker service create
命令中通过--mode
选项可以指定要使用的 service 部署模式,默认为 replicated
模式。
docker service create --name toms --mode global -p 9000:8080 tomcat:8.5.49
该模式会在每个节点上分配一个 task。
对于 global 模式来说,若要实现对 service 的 task 数量的变更,必须通过改变该 servicve所依附的 swarm 集群的节点数量来改变。节点增加,则 task 会 <font color=red>自动增加</font>;节点减少,则 task会<font color=red>自动减少</font>。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。