在之前的几篇文章中,我们介绍了Docker Compose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用;我们也介绍了Docker swarm,它构建了docker集群,并且可以通过docker service在不同集群节点上运行容器服务,但是缺点是不能同时编排多个服务。
但是在实际的生产开发中,我们一个完整的应用需要的服务往往不止一个,通过docker service 命令来部署的话会很麻烦,所以这里要讲一下 Docker Stack,它用于向swarm集群部署完整的应用程序堆栈,可以在分布式多机器上同时编排多个有依赖关系的服务。
Stack 能够在单个声明文件中定义复杂的多服务应用,还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!可以简单地理解为Stack是集群下的Compose。
Docker Stack 编排依赖于声明文件,其实也就是Docker Compse文件,不过Stack对于Compose文件有一个要求,文件的规范版本(顶层关键字version
)必须是“3.0”或以上
,而且一些Docker Compse文件中的关键字不受支,如:
- build
- cgroup_parent
- container_name
- devices
- tmpfs
- external_links
- links
- network_mode
- restart
- security_opt
- userns_mode
由于 build 关键字在 Stack 中不受支持,不能在编排的过程中构建镜像,docker stack部署用到的镜像必须是已经构建发布好并且发布到 docker 仓库的,在服务编排过程各个节点中直接从 docker 仓库拉取。
1. 部署应用
Docker Stack的部署很简单,在 Compose 文件中定义应用,然后通过 docker stack deploy 命令进行部署和管理。以下以一个简单的 .net core 应用示例,应用中包含一个 webapi 服务和一个 redis 服务,webapi 服务依赖于 redis 服务实现一个简单的计数功能,其实这就是 docker 官网上的例子,只不过官网用 python 实现,这里用 .net core。
(1)新建一个webapi项目,启用docker支持,安装 StackExchange.Redis.Extension 依赖包
Install-Package StackExchange.Redis.Extension
同时为了方便测试,关闭掉了 https 重定向,并且将 swagger 开发环境的限制去掉
(2)添加一个控制器,简单地实现计数功能
[ApiController]
[Route("[controller]")]
public class CountController : Controller
{
private readonly IDatabase _db;
public CountController()
{
var connect = ConnectionMultiplexer.Connect("redis:6379");
_db = connect.GetDatabase();
}
[HttpGet]
[Route("count")]
public async Task<string> CountAsync()
{
var count = await _db.StringIncrementAsync("count");
return $"您已点击{count}次!";
}
}
这里目的不是演示 redis 的使用,所以代码就写得随便了,日常工作中的使用大家都应该进行一下封装。连接字符串中的 “redis” 是 stack 编排时 redis 服务的名称。
(3)将web api应用发布到docker仓库
(4)编写docker-compose.yaml文件
version: "3.9"
services:
webapi:
image: 1.12.64.68:8082/stacksample
ports:
- "8002:80"
networks:
- webapi-net
redis:
image: redis:alpine
networks:
- webapi-net
networks:
webapi-net:
Compose 文件非常重要,是我们整个应用堆栈的组织文件,能够反应我们应用的状态,通常也必须纳入代码版本管理,我们可以先在单机模式的 docker 主机上通过 docker compose 进行测试,检查我们的 docker compose 文件编写有没有问题,如果我们的镜像没有提前发布,或者应用中服务比较多单个发布太麻烦的情况下,也可以通过 docker compose 进行镜像的构建发布。
(5)在swarm集群管理节点上通过 docker stack 命令部署应用
在管理节点上运行以下命令:
docker stack deploy --with-registry-auth --compose-file docker-compose.yml stacksample
通过输出可以看到,在 Docker 根据 Stack 文件部署应用的时候,首先会检查并创建顶层 networks 关键字对应的网络。如果对应网络不存在,Docker 会进行创建。网络是先于服务创建的,这是因为服务依赖于网络。这里我定义了 webapi-net 网络,如果没有定义网络的情况下stack会自动创建名为 default 的网络。
通过 docker stack services 命令可以查看已经部署的服务
docker stack service stacksample
Docker 将 Stack 名称附加到由他创建的任何资源名称前作为前缀。在本例中,Stack 名为 stacksample,所以所有资源名称的格式都如: stacksample_<resource>
,而在部署之前创建的资源则不会被重命名。
(6)测试
访问swarm集群中的任意一个节点,打开swagger,测试接口
到这里,一个最基本的stack应用部署就完成了
2. 管理应用
Stack 是由普通的 Docker 资源构建而来,包括网络、卷、密钥、服务等,是对一组相关联的服务和基础设施的统一部署和管理。
虽然我们可以通过普通的 docker 命令对 stack 中的服务、副本容器进行查看和重新配置,但是还是推荐通过声明式方式修改,即将 Compose 文件作为配置的唯一声明。这样,所有 Stack 相关的改动都需要体现在 Compose 文件中,然后更新重新部署应用所需的 Compose 文件。
通过 Compose 文件对 Stack 进行管理,我们可以通过文件一目了然的知道整个 Stack 应该达到的正常状态,也可以避免后续管理过程中操作被 Compose 文件覆盖。
Compose 文件中有 deploy
关键字支持集群化的服务部署,可配置的东西和 docker services create 命令中的参数类似,之前的 Docker compose一节也有讲到,不清楚的童鞋可以进行回顾。
刚刚部署的 webapi服务只有一个副本,如果要对它进行扩容,只需要修改 Compose 文件如下:
version: "3.9"
services:
webapi:
image: 1.12.64.68:8082/stacksample
ports:
- "8002:80"
networks:
- webapi-net
deploy:
mode: replicated
replicas: 3
redis:
image: redis:alpine
networks:
- webapi-net
networks:
webapi-net:
之后重新执行 docker stack deploy 命令进行更新
命令之后更只会更新存在变更的部分,更新之后经过一小段时间再次使用docker stack ps 命令查看状态,可以看到 webapi 服务已经扩容到了3个。在更新的过程中,由于节点需要拉取镜像创建容器,并不会马上就可以达到期待状态。
所有应用 Stack 都应采用该方式进行更新。所有的变更都应该通过 Compose 文件进行声明,然后通过 docker stack deploy 进行部署。这种方式能让我们通过 Compose 文件知道应该达到的期待状态是什么样的,而 Compose 文件也应该放到一个合适的版本控制系统当中,这样子我们如果需要回滚 Stack,只需要重新部署上一个版本的 Compose 文件即可。
3. Stack 基本命令
docker stack 命令用于swam集群中对应用堆栈涉及到的多个服务进行编排部署和全生命周期管理,常用的命令如下,可用- -help查看详细说明:
3.1 docker stack deploy [OPTIONS] STACK
根据 Stack 文件(通常是 docker-compose.yml)部署和更新 Stack 服务的命令,常用选项如下:
- -c:指定compose文件路径
- –with-registry-auth:服务创建的时候,各个工作节点同步管理节点的私有仓库登录凭证,从而各个节点可用拉取私有仓库镜像
3.2 docker stack ls [OPTIONS]
列出 Swarm 集群中的全部 Stack,包括每个 Stack 拥有多少服务。
3.3 docker stack ps [OPTIONS] STACK
列出某个已经部署的 Stack 相关详情。该命令支持 Stack 名称作为其主要参数。
在服务启动失败时,docker stack ps
命令是首选的问题定位方式。该命令展示了 Stack 中每个服务的概况,包括服务副本所在节点、当前状态、期望状态以及异常信息,再配合 docker service logs
查看某个具体服务或任务的详细信息。
3.4 docker stack services [OPTIONS] STACK
列出某个已经部署的 Stack 的服务,包括服务的模式,使用的镜像,端口映射等。
3.5 docker stack rm [OPTIONS] STACK [STACK…]
从 Swarm 集群中移除 一个或多个 Stack。移除操作执行前并不会进行二次确认。
文章来源:https://www.toymoban.com/news/detail-454053.html
这一篇文章对于stack讲得比较简单,主要是演示的应用很简单,想要再了解一些stack部署相关的知识点的话可以看一下 Docker Stack是什么,这篇文章结合 dockersamples/atsea-sample-shop-app 开源项目详细得将stack相关的知识点讲了一遍,项目不算复杂,对于初学者也不难,但又涉及到比较多的知识点。
微服务系列文章:
上一篇:容器技术—docker swarm(二)文章来源地址https://www.toymoban.com/news/detail-454053.html
到了这里,关于容器技术—docker stack的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!