容器技术—docker stack

这篇具有很好参考价值的文章主要介绍了容器技术—docker 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 开发环境的限制去掉

容器技术—docker stack
(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仓库
容器技术—docker stack
容器技术—docker stack
(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 进行镜像的构建发布。
容器技术—docker stack
(5)在swarm集群管理节点上通过 docker stack 命令部署应用
在管理节点上运行以下命令:

docker stack deploy --with-registry-auth --compose-file docker-compose.yml stacksample

容器技术—docker stack
通过输出可以看到,在 Docker 根据 Stack 文件部署应用的时候,首先会检查并创建顶层 networks 关键字对应的网络。如果对应网络不存在,Docker 会进行创建。网络是先于服务创建的,这是因为服务依赖于网络。这里我定义了 webapi-net 网络,如果没有定义网络的情况下stack会自动创建名为 default 的网络。

通过 docker stack services 命令可以查看已经部署的服务

docker stack service stacksample

容器技术—docker stack
Docker 将 Stack 名称附加到由他创建的任何资源名称前作为前缀。在本例中,Stack 名为 stacksample,所以所有资源名称的格式都如: stacksample_<resource>,而在部署之前创建的资源则不会被重命名。

(6)测试
访问swarm集群中的任意一个节点,打开swagger,测试接口
容器技术—docker stack
到这里,一个最基本的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
命令之后更只会更新存在变更的部分,更新之后经过一小段时间再次使用docker stack ps 命令查看状态,可以看到 webapi 服务已经扩容到了3个。在更新的过程中,由于节点需要拉取镜像创建容器,并不会马上就可以达到期待状态。
容器技术—docker stack
所有应用 Stack 都应采用该方式进行更新。所有的变更都应该通过 Compose 文件进行声明,然后通过 docker stack deploy 进行部署。这种方式能让我们通过 Compose 文件知道应该达到的期待状态是什么样的,而 Compose 文件也应该放到一个合适的版本控制系统当中,这样子我们如果需要回滚 Stack,只需要重新部署上一个版本的 Compose 文件即可。

3. Stack 基本命令

docker stack 命令用于swam集群中对应用堆栈涉及到的多个服务进行编排部署和全生命周期管理,常用的命令如下,可用- -help查看详细说明:
容器技术—docker stack

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(二)文章来源地址https://www.toymoban.com/news/detail-454053.html

到了这里,关于容器技术—docker stack的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker技术--Docker容器管理

    1.Docker 容器相关的指令(单个容器操)        我们之前在Docker中部署了一个实际应用的案例wordpress,其中使用到了一些相关于容器的指令,那么下面我们一起来总结使用。 Docker指令的语法规则如下所示: Docker + 命令 [+参数选项] -1 类:关闭、开启、重启、开启自启 systemct

    2024年02月11日
    浏览(42)
  • TeamView: 为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户

    TeamViewPC端远程连接另外一台电脑 弹出窗口:为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户 电脑浏览器自动跳转到手机号验证页面,输入正确的手机号后,点击验证却一直提示 手机号无效、手机号未知等异常。 复制验证链接到手机 https://login.teamviewer.

    2024年02月14日
    浏览(64)
  • 容器和云原生(二):Docker容器化技术

      目录 Docker容器的使用 Docker容器关键技术 Namespace  Cgroups UnionFS         首先直观地了解docker如何安装使用,并快速启动mysql服务的,启动时候绑定主机上的3306端口,查找mysql容器的ip,使用mysql -h containerIP 或者127.0.0.1就可以直接访问mysql服务,暂不考虑mysql的存储卷。    

    2024年02月12日
    浏览(45)
  • 容器技术(Docker)

    容器技术的核心就是通过对资源的 限制 和 隔离 把进程运行在一个沙盒中。并且这个沙盒可以被打包成容器镜像(Image),移植到另一台机器上可以直接运行,不需要任何的多余配置。其中docker是容器技术的事实标准。 使用容器部署有什么优势? 容器具有强一致性,由同一

    2024年02月10日
    浏览(42)
  • Docker容器技术详解(四)

    本文章将介绍docker-compose技术,如果想要了解docker前置内容,可以查看以下两篇文章. Docker容器技术详解(一) Docker容器技术详解(二) Docker容器技术详解(三) 注意,要想使用docker-compose命令的话需要在有docker-compose.yml文件的目录才能使用docker-compose命令 启动docker-compose.yml文件 查看

    2024年02月08日
    浏览(40)
  • docker容器技术

    什么是docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于

    2024年02月06日
    浏览(34)
  • 容器化技术-Docker

    一、引言 1.1 什么是Docker(重要 - 部署)? Docker 是一个开源的应用 容器 引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙

    2024年02月04日
    浏览(31)
  • Docker容器技术之镜像制作

    上篇文章说到过,作为用户是不需要制作镜像的,因为几乎所有常用的数据局库、应用软件、中间件在Docker Hub 里面可以找到,但是如果到了万不得已的时候我们还是要自己制作镜像,比如给自己编写的软件制作镜像。 制作镜像有两种方法: 1.docker commit命令 2.编写Dockerfile利

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包