容器技术—docker stack

  • 1. 部署应用
  • 2. 管理应用
  • 3. Stack 基本命令
    • 3.1 docker stack deploy [OPTIONS] STACK
    • 3.2 docker stack ls [OPTIONS]
    • 3.3 docker stack ps [OPTIONS] STACK
    • 3.4 docker stack services [OPTIONS] STACK
    • 3.5 docker stack rm [OPTIONS] STACK [STACK...]

在之前的几篇文章中,我们介绍了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/stacksampleports:- "8002:80"networks:- webapi-netredis:image: redis:alpinenetworks:- webapi-netnetworks: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/stacksampleports:- "8002:80"networks:- webapi-netdeploy:mode: replicatedreplicas: 3redis:image: redis:alpinenetworks:- webapi-netnetworks: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。移除操作执行前并不会进行二次确认。


这一篇文章对于stack讲得比较简单,主要是演示的应用很简单,想要再了解一些stack部署相关的知识点的话可以看一下 Docker Stack是什么,这篇文章结合 dockersamples/atsea-sample-shop-app 开源项目详细得将stack相关的知识点讲了一遍,项目不算复杂,对于初学者也不难,但又涉及到比较多的知识点。


微服务系列文章:
上一篇:容器技术—docker swarm(二)

容器技术—docker stack相关推荐

  1. 云漫圈 | 容器技术docker应用场景解析

    戳蓝字"CSDN云计算"关注我们哦! 作者:channingbreeze 文章转载自程序员乔戈里 话说小史已经接受了A厂的offer,这不,已经在公司附近租好了房子,准备搬家过去住 ...

  2. 漫画 | 从搬家到容器技术 Docker 应用场景解析

    作者 |  channingbreeze 责编 | 仲培艺 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 生活现场 话说小史已经接受了 A ...

  3. 企业级容器技术 Docker

    企业级容器技术 Docker docker隔离级别中包含两个核心组成: Namespace(名称空间):namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内 ...

  4. 企业级容器技术Docker

    1 Docker 介绍和基础操作 移植性比较好----拥有独自的仓库,但要内核新 可移植性,标准化,隔离性) 1.1.2 Docker 是什么 Docker 是基于 Linux 内核实现,最早采用 L ...

  5. 容器技术 - docker

    文章目录 一.Docker简介 1.1 Docker诞生 1.2 Docker相关解释 1.3 Docker与传统虚拟化对比 1.4 Docker的构成 二.Docker安装 2.1 Docker的安 ...

  6. 【云原生之企业级容器技术 Docker实战一】Docker 介绍

    目录 一.Docker 介绍 1.1 容器历史 1.2 Docker 是什么 1.3 Docker 和虚拟机,物理主机 1.4 Docker 的组成 1.5 Namespace 1.6 Control ...

  7. 容器技术Docker

    文章目录 一.引言 1.1 环境不一致 1.2 隔离性 1.3 弹性伸缩 1.4 学习成本 二.Docker介绍 2.1 Docker的由来 2.2 Docker的思想 三.Docker的安装 3.1 ...

  8. 企业级容器技术docker(12)docker swarm

    docker srack部署 写一个compose文件 version: '3' services:web1:image: passyt.com/library/nginxports:- " ...

  9. 【容器技术——docker管理】

    文章目录 容器是什么? Docker安装 Docker的安装方式 Docker容器管理 Docker镜像管理 镜像仓库构建 1)官方仓库构建 2)Harbor构建 Docker网络管理 1)Docke ...

  10. 容器技术——docker小白入门

    docker是什么: Docker的主要目标是"Build,Ship and Run Any App,Anywhere",也就是通过对应用组件的封装.分发.部署.运行等生命周期的管 ...

最新文章

  1. Ubuntu首次开启root用户
  2. 图片验证码防暴力破解_Java
  3. c++学习之const成员变量与成员函数
  4. iscsi 同步_群晖六盘位旗舰NAS,一文教你如何解决多设备同步,跨平台协调
  5. 再见了Spring!这个架构有点厉害,甚至干掉了Dubbo!
  6. 12c RMAN新特性之Recover Table
  7. 怎样配置Tomcat环境变量
  8. 使用QT5 PrintSupport打印和预览标签
  9. 在线字符或文本转二进制工具
  10. 移动智能终端PIN码破解
  11. 如何在PDF中修改内容?这个方法免费编辑
  12. ipv4 pxe 联想start_start pxe over ipv4 和start pxe over ipv6 开机出现问题
  13. Linux下 ifconfig 命令的使用(Linux命令)
  14. linux centos rar解压,Centos解压rar压缩文件
  15. 华为防火墙的策略路由
  16. 计算机毕业设计php小说阅读网站
  17. 关于mybatis的分页实现
  18. maskrcnn_benchmark 代码详解之 roi_box_predictors.py
  19. m3u8中ts文件无损批量合并与转换方法
  20. 中创专利|中国5G标准必要专利达1.8万项,尊重知识产权,共建知识产权强国

热门文章

  1. 优秀的程序员都热爱写作
  2. CTF训练(密码学)——Atbash Cipher
  3. spark的fold函数理解
  4. Docker个人理解与初级使用
  5. 20个免费论文下载入口_含免费知网、万方、维普帐号
  6. Could not create connection to database server. Attempted reconnect 3 times. Giving up.
  7. [网站推荐] 百度识图
  8. DNA甲基化经CTCF和黏连蛋白复合体调节RNA可变剪切
  9. 规范的计算机网络规模分类,就计算机网络按规模分类而言,下列说法中规范的是( )。...
  10. Unity3D 物体移动到指定点