Docker Swarm Mode
Docker Swarm 集群搭建
Docker Swarm 节点维护
Docker Service 创建
service 只能依附于 docker swarm 集群,所以 service 的创建前提是,swarm 集群搭建完毕。
1. 创建 service
docker service create
命令用于创建 service,需要在 manager
中运行。与创建容器的命令 docker run 非常类似
目前的节点状态如下:
在 swarm 中创建一个运行 tomcat:8.5.49
镜像的 service,服务名称为 toms,包含3 个副本 task,对外映射端口号为 9000。当一个 service 包含多个 task 时,对 service 的访问最终会通过 负载均衡 方式转发给各个 task 处理。这个负载均衡为轮询策略。
docker service create --name toms --replicas 3 -p 9000:8080 tomcat:8.5.49
1.1 查看服务列表
docker service ls
命令用于查看当前 swarm 集群中正在运行的 service 列表信息。一个swarm 中可以运行多个 service。
1.2 查看服务详情
通过 docker service inspect [service name|service ID]
命令可以查看指定 service 的详情。
1.3 用户访问服务
服务创建完毕后,该服务也就运行了起来。此时就可通过浏览器进行访问了
也可以直接通过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
1.4 查看 task 节点
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 开始的流水号形成的。
1.5 查看指定节点的 task
通过 docker node ps [node]
可以查看指定节点中运行的 task 的信息。默认查看的是当前节点的task 信息。
1.6 查看服务日志
通过 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>
查看错误信息
1.7 查看节点容器
在 docker2、docker3、docker 三个主机中查看正在运行的容器列表,可以看到相应的tomcat 容器。
容器的 NAME 是由 task name 后添加 task ID 形成的。在 docker4、docker5 主机中是没有该服务的 task 容器的。
1.8 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三个节点上了,这个结果是由编排器与分发器共同维护的。
1.9 task 容错
当某个 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
2. 服务删除
通过 docker service rm [service name|service ID]
可以删除指定的一个或多个 service。
删除后,该 service 消失,当然,该 service 的所有 task 也全部删除,task 相关的节点容器全部消失。
3. 滚动更新
当一个 service 的 task 较多时,为了不影响对外提供的服务,在对 service 进行更新时可采用滚动更新方式。
需求:将原本镜像为 tomcat:8.5.49 的 service 的镜像滚动更新为tomcat:8.5.39
- 创建一个包含 10 个副本 task 的服务,该服务使用的镜像为 tomcat:8.5.49。
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
- 将 service 使用的镜像由 tomcat:8.5.49 更新为 tomcat:8.5.39。
- 观察更新和创建的过程
docker service ps toms
会发现这个更新的过程就是前面在创建服务时指定的那样,每次更新 2 个 task,更新间隔为 3 秒。
3.1 更新回滚
在更新过程中如果更新失败,则会按照设置的回滚策略进行回滚,回滚到更新前的状态。但也可通过命令方式手工回滚。
# 按照前面设置的每次回滚 2 个 task,每次回滚间隔 3 秒进行回滚
docker service update --rollback toms
需要注意,task name 保持未变,但 task ID 与原来的 task ID 也是不同的,并不是恢复到了更新之前的 task ID。即编排器新创建了 task,并由分发器重新为其分配了 node。
4. service 全局部署模式
在 docker service create
命令中通过--mode
选项可以指定要使用的 service 部署模式,默认为 replicated
模式。
docker service create --name toms --mode global -p 9000:8080 tomcat:8.5.49
该模式会在每个节点上分配一个 task。
4.1 task 伸缩
对于 global 模式来说,若要实现对 service 的 task 数量的变更,必须通过改变该 servicve所依附的 swarm 集群的节点数量来改变。节点增加,则 task 会 自动增加;节点减少,则 task会自动减少。