Docker Service 创建

2023-10-24 15:28:00 浏览数 (2)

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 处理。这个负载均衡为轮询策略

代码语言:javascript复制
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:WindowsSystem32driversetchosts文件中加入如下:

代码语言:javascript复制
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 nameservice 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 在节点容器中的运行日志。

代码语言:javascript复制
# -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 在节点容器中的运行日志。

代码语言:javascript复制
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 数量进行变更。

代码语言:javascript复制
docker service update --replicas 5 toms

(2)docker service scale 方式

通过 docker service scale 命令可以为指定的服务变更 task 数量。

代码语言:javascript复制
# docker service scale SERVICE=REPLICAS
docker service scale toms=7
docker service scale toms=3

(3)暂停节点的 task 分配

生产环境下,可能由于某主机性能不高,在进行 task 扩容时,不想再为该主机再分配更多的 task,此时可通过 pause 暂停该主机节点的可用性来达到此目的。

代码语言:javascript复制
docker node update --availability pause <nodeID>

更新前有3个task,分别在docker、docker2、docker3节点上,更新副本数为10后,docker2 上边还是只有一个task

(4)清空 task

由于某节点出现了性能问题,需要停止服务进行维修,此时最好是将该节点上的task 清空,以不影响 service 的整体性能。

通过 docker node update –availability drain 命令可以清空指定节点中的所有 task。

代码语言:javascript复制
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。

代码语言:javascript复制
# 在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

  1. 创建一个包含 10 个副本 task 的服务,该服务使用的镜像为 tomcat:8.5.49。
代码语言:javascript复制
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
  1. 将 service 使用的镜像由 tomcat:8.5.49 更新为 tomcat:8.5.39。
  1. 观察更新和创建的过程
代码语言:javascript复制
docker service ps toms

会发现这个更新的过程就是前面在创建服务时指定的那样,每次更新 2 个 task,更新间隔为 3 秒。

3.1 更新回滚

在更新过程中如果更新失败,则会按照设置的回滚策略进行回滚,回滚到更新前的状态。但也可通过命令方式手工回滚。

代码语言:javascript复制
# 按照前面设置的每次回滚 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 模式。

代码语言:javascript复制
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会自动减少

0 人点赞