Docker Service 创建

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Docker Service 创建

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 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 在节点容器中的运行日志。

# -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

  1. 创建一个包含 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
  1. 将 service 使用的镜像由 tomcat:8.5.49 更新为 tomcat:8.5.39。

  1. 观察更新和创建的过程
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会自动减少

相关实践学习
日志服务之数据清洗与入湖
本教程介绍如何使用日志服务接入NGINX模拟数据,通过数据加工对数据进行清洗并归档至OSS中进行存储。
相关文章
|
Linux iOS开发 Docker
docker报错:New main PID does not belong to service
docker报错:New main PID does not belong to service
338 0
|
2月前
|
负载均衡 算法 应用服务中间件
Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)
Docker Swarm总结+service创建和部署、overlay网络以及Raft算法(2/5)
400 0
|
关系型数据库 MySQL 数据库
docker容器内启动mysql服务,报错:New main PID 99 does not belong to service, and PID file is not owned by root.
docker容器内启动mysql服务,报错:New main PID 99 does not belong to service, and PID file is not owned by root.
455 0
|
Linux Docker 容器
【亲测有效】Centos安装完成docker后启动docker报错docker: unrecognized service的两种解决方案
【亲测有效】Centos安装完成docker后启动docker报错docker: unrecognized service的两种解决方案
916 0
|
Docker 容器 关系型数据库
Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
微服务架构的应用由若干 service 组成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 service 运行了若干容器。
1464 0
|
Web App开发 Kubernetes Docker
|
Web App开发 网络协议 Docker
DNS 访问 Service - 每天5分钟玩转 Docker 容器技术(138)
在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。
1491 0
|
Docker 容器 Perl
Service IP 原理 - 每天5分钟玩转 Docker 容器技术(137)
Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的。
6687 0
|
Kubernetes Docker 容器
通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)
Kubernets 通过 Service 访问 Pod。本节我们开始学习 Service。
1923 0
|
测试技术 Docker 容器
用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)
上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode。无论采用 global mode 还是 replicated mode,副本运行在哪些节点都是由 Swarm 决定的,作为用户我们有没有可能精细控制 Service 的运行位置呢? 答案是:能,使用 label。
1555 0