【Docker】swarm stack部署多service应用

前面我们已经学习过了Docker Compose,它可以用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是只能在单机模式使用,不能在分布式多机器上使用;前面我们也学习了Docker swarm,它可以将单个服务部署为多个容器,并运行在不同集群节点上,构成服务集群,缺点是只能部署单个服务,不能同时编排多个服务。

但是在实际的生产开发中,我们一个完整的应用需要的服务往往不止一个,通过docker service命令来部署的话会很麻烦,那么能不能结合Docker Compose+Docker swarm的优点呢?这就是Docker Stack。

Docker Stack用于向swarm集群部署完整的应用程序堆栈,可以在分布式多机器上同时编排多个有依赖关系的服务。能够在单个声明文件中定义复杂的多服务应用,还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 -> 健康检查 -> 扩容 -> 更新 -> 回滚,以及其他功能!可以简单地理解为Docker Stack是集群下的Docker Compose。
在这里插入图片描述

Docker Compose中的不支持项

Docker Stack编排依赖于声明文件,其实也就是Docker Compse文件,不过Docker Stack对于Docker Compose文件有一个要求,文件的规范版本(顶层关键字version)必须是“3.0”或以上,而且一些Docker Compse文件中的关键字不受支持,如:

  • build
  • cgroup_parent
  • container_name
  • devices
  • tmpfs
  • external_links
  • links
  • network_mode
  • restart
  • security_opt
  • userns_mode

由于build关键字在Docker Stack中不受支持,不能在编排的过程中构建镜像,docker stack部署用到的镜像必须是已经构建发布好,并且发布到docker仓库的,在服务编排过程各个节点中直接从docker仓库拉取。

先构建镜像:

$ sudo docker image build -t flask-demo .

登陆远程镜像仓库:

$ sudo docker login --username=xxx@xxxx.com registry.cn-hangzhou.aliyuncs.com

这里使用的是阿里云的免费镜像仓库:https://cr.console.aliyun.com/cn-hangzhou/instances

再修改镜像的tag:

$ sudo docker image tag flask-demo:latest registry.cn-hangzhou.aliyuncs.com/morris131/flask-demo:latest

最后将镜像推送至远程仓库:

$ sudo docker push  registry.cn-hangzhou.aliyuncs.com/morris131/flask-demo:latest

手动部署多service

先创建一个overlay网络:

$ sudo docker network create -d overlay mynet
kunkv8prss5gihgz5deowhdfw

然后部署redis service:

$ sudo docker service create --name redis --network mynet redis:latest redis-server --requirepass ABC
bn507bk9aaggf1lhhpnask9kq
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

部署flask-demo service

$ sudo docker service create --name flask-demo --network mynet --env REDIS_HOST=REDIS --env REDIS_PASS=ABC -p 8080:5000 flask-demo:latest
image flask-demo:latest could not be accessed on a registry to record
its digest. Each node will access flask-demo:latest independently,
possibly leading to different nodes running different
versions of the image.

xx9chfrx2ro3j8cnvab5vp0pm
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

查看服务,可以看到flask-demo和redis都已经部署成功:

$ sudo docker service ls
ID             NAME         MODE         REPLICAS   IMAGE               PORTS
7yr3lamfse5k   flask-demo   replicated   1/1        flask-demo:latest   *:8080->5000/tcp
bn507bk9aagg   redis        replicated   1/1        redis:latest

访问flask-demo服务:

$ curl 172.20.160.13:8080
Hello Container World! I have been seen 3 times and my hostname is bf03f59d3bab.

Docker Stack部署多service

前面可以看到通过docker service手动部署多个service非常繁琐,需要一个一个service部署。

接下来使用Docker Stack来部署多service的服务。

编写docker-compose.yml:

version: "3.3"

services:
  flask-demo:
    image: registry.cn-hangzhou.aliyuncs.com/morris131/flask-demo
    environment:
      - REDIS_HOST=redis-server
      - REDIS_PASS=ABC
    networks:
      - demo-network
    ports:
      - 8080:5000

  redis-server:
    image: redis:latest
    command: redis-server --requirepass ABC
    networks:
     - demo-network

networks:
  demo-network:

启动服务:

$ sudo docker stack deploy --compose-file docker-compose.yml flask
Creating network flask_demo-network
Creating service flask_redis-server
Creating service flask_flask-demo

访问服务:

$ curl 172.20.160.13:8080
Hello Container World! I have been seen 1 times and my hostname is 4a88aad138e7.

Stack基本命令的使用

Docker stack命令用于swam集群中对应用堆栈涉及到的多个服务进行编排部署和全生命周期管理。

常用的命令如下,可用help命令查看详细说明:

$ sudo docker stack help

Usage:  docker stack COMMAND

Manage Swarm stacks

Commands:
  config      Outputs the final config file, after doing merges and interpolations
  deploy      Deploy a new stack or update an existing stack
  ls          List stacks
  ps          List the tasks in the stack
  rm          Remove one or more stacks
  services    List the services in the stack

Run 'docker stack COMMAND --help' for more information on a command.

docker stack deploy

docker stack deploy [OPTIONS] STACK

根据Stack文件(通常是 docker-compose.yml)部署和更新Stack服务的命令,常用选项如下:

  • -c:指定compose文件路径
  • –with-registry-auth:服务创建的时候,各个工作节点同步管理节点的私有仓库登录凭证,从而各个节点可用拉取私有仓库镜像

docker stack ls

docker stack ls

列出Swarm集群中的全部Stack,包括每个Stack拥有多少服务。

例如:

$ sudo docker stack ls
NAME      SERVICES
flask     2

docker stack ps

docker stack ps [OPTIONS] STACK

列出某个已经部署的Stack相关详情。该命令支持Stack名称作为其主要参数。

在服务启动失败时,docker stack ps命令是首选的问题定位方式。该命令展示了Stack中每个服务的概况,包括服务副本所在节点、当前状态、期望状态以及异常信息,再配合docker service logs查看某个具体服务或任务的详细信息。

$ sudo docker stack ps flask
ID             NAME                   IMAGE                                                           NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
oaq79y2xpvz0   flask_flask-demo.1     registry.cn-hangzhou.aliyuncs.com/morris131/flask-demo:latest   node1     Running         Running 6 minutes ago
03j987pc0yyn   flask_redis-server.1   redis:latest                                                    node2     Running         Running 5 minutes ago

docker stack services

docker stack services [OPTIONS] STACK

列出某个已经部署的Stack的服务,包括服务的模式,使用的镜像,端口映射等。

$ sudo docker stack services flask
ID             NAME                 MODE         REPLICAS   IMAGE                                                           PORTS
yoynkqh2mh9n   flask_flask-demo     replicated   1/1        registry.cn-hangzhou.aliyuncs.com/morris131/flask-demo:latest   *:8080->5000/tcp
yrg986m18pps   flask_redis-server   replicated   1/1        redis:latest

docker stack rm

docker stack rm [OPTIONS] STACK [STACK...]

从Swarm集群中移除一个或多个Stack。移除操作执行前并不会进行二次确认。

$ sudo docker stack rm flask
Removing service flask_flask-demo
Removing service flask_redis-server
Removing network flask_demo-network

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/232361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙生态开发就业前景到底好不好

鸿蒙生态开发是指基于华为自主研发的操作系统鸿蒙(HarmonyOS)进行应用程序开发和生态建设。目前,鸿蒙生态开发的前景非常好,原因如下:做鸿蒙应用开发到底学习些啥? (qq.com) 1:政府支持&#x…

万界星空科技mes系统中看板管理

我们很多企业现在都有大屏,那到底万界星空科技低代码云mes系统管理中看板管理有什么作用?我总结了几条: 1.提高车间的生产效率 2.有效的监控设备运行状况 3.控制生产线运行 4.增加和改善用户体验 5.提高工作效率和工作安全性

综述 2019-Genome Biology:非比对方法的benchmark

Zielezinski, Andrzej, et al. "Benchmarking of alignment-free sequence comparison methods." Genome biology 20.1 (2019): 1-18. Benchmarking of alignment-free sequence comparison methods | Genome Biology | Full Text 被引次数:170&#xff…

【算法通关村】链表反转经典问题解析

🚩本文已收录至算法学习之旅 一.基础反转 我们通常有两种方法反转链表,一种是直接操作链表实现反转操作,一种是建立虚拟头节点辅助实现反转操作。 力扣习题链接:206. 反转链表 (1) 直接操作实现反转 我们需要一个变量pre来保…

代码随想录算法训练营第45天| 139.单词拆分 多重背包

JAVA代码编写 139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 **注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 1: 输入: s &…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈,制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备,实现生产线的智能化和自适应生产,优化生产流程,提高生产效率和质量,为企业创造更大的价值。 方案概述 智…

Linux 压缩、文件传输与安装

目录 1. 压缩 1.1 tar 1.2 gzip 1.3 zip 1.4 rar 2 文件传输 2.1 网站下载 2.2 scp 传输 2.3 rz 和 sz 2.4 xftp 3.安装 3.1 编译安装 (ngnix) 3.2 rpm 安装 3.3 yum 安装 1. 压缩 1.1 tar 使用 tar 压缩文件时,会保留源文件…

使用MetaMask + Ganache搭建本地私有网络并实现合约部署与互动

我使用Remix编写合约,MetaMask钱包工具和Ganache搭建了一个私有网络,并且实现了合约的部署和互动。 在前面的博客中提到了 Remix在线环境及钱包申请 以及 Solidity的基本语法 ,没看过的小伙伴可以点击链接查看一下,都是在本专栏下…

智能时代:互联网+如何改变我们的生活与工作

引言 随着科技的不断进步和互联网的普及,我们正处在一个智能时代。这个时代被互联网所定义,它深刻地改变了我们的生活和工作方式。从社交互动到日常工作,智能时代的影响无处不在,给人们带来了前所未有的变革和机遇。 互联网的涌…

模电·放大电路的分析方法——图解法

放大电路的分析方法——图解法 静态工作点的分析电压放大倍数的分析波形非线性失真的分析直流负载线与交流负载线图解法的适用范围 在实际测出放大管的输入特性、输出特性和已知放大电路中其它各元件参数的情况下,利用作图的方法对放大电路进行分析即为图解法。 静…

FacetWP WordPress网站高级筛选过滤插件(含所有扩展)

点击阅读FacetWP WordPress网站高级筛选过滤插件原文 FacetWP WordPress网站高级筛选过滤插件向电子商务网站、资源库、搜索页面等添加分面搜索。FacetWP 的过滤元素(称为 facets)动态调整以适应用户输入。这有助于防止出现“未找到结果”,从…

OpenSSL 编程指南

目录 前言初始化SSL库创建SSL 上下文接口(SSL_CTX)安装证书和私钥加载证书(客户端/服务端证书)加载私钥/公钥加载CA证书设置对端证书验证例1 SSL服务端安装证书例2 客户端安装证书创建和安装SSL结构建立TCP/IP连接客户端创建socket服务端创建连接创建SSL结构中的BIOSSL握手服务…

【MATLAB源码-第99期】基于matlab的OFDM系统卡尔曼滤波(kalman)信道估计,对比LS,MMSE。

操作环境: MATLAB 2022a 1、算法描述 卡尔曼滤波器(Kalman Filter)是一种有效的递归滤波器,它能够从一系列的含有噪声的测量中估计动态系统的状态。在无线通信领域,尤其是在正交频分复用(OFDM&#xff0…

Pandas中的Series(第1讲)

Pandas中的Series(第1讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

Redis基础入门

第1章:引言 大家好!我是小黑,今天咱们来聊聊Redis。Redis,这个名字你可能在不少地方听过,尤其是在后端开发领域,它可是个大名鼎鼎的角色。,Redis是一个开源的内存中数据结构存储系统&#xff0…

利用jdbc对数据库进行增删改查

步骤/过程: 1,导入驱动包 2,加载驱动包 3,输入信息,进行数据库连接 4,创建 statement对象 5,执行sql语句 6,如果是查询操作,利用ResultSet处理数据&#xf…

Plantuml之类图语法介绍(十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Ubuntu中编译出Windows的可执行程序(.exe)

1、前言 在嵌入式开发中,交叉编译是很常见的情况,如果你把Windows电脑也看做一块高性能的开发板,那在Ubuntu中编译出Windows上运行的可执行程序也是很好理解的行为。 2、安装mingw64环境 sudo apt-get install mingw-w64 3、测试编译链是否安…

淘宝权益玩法平台的Serverless化实践

通过对权益玩法平台现有业务应用的Serverless化改造,权益团队在双十一期间完美地支撑了业务需求,在研发效率、运维保障等方面都体现出了很高的价值和收益。 项目背景 淘宝权益平台是负责淘宝权益营销的核心团队,团队除了负责拉菲权益平台外&a…

反汇编语言区分函数和运算符

在汇编语言中,函数和运算符可以通过一些特定的指令和约定来区分。 函数: 函数通常由一系列指令组成,用于执行特定的任务或操作。函数通常具有入口点和出口点,分别表示函数的开始和结束位置。函数通常包含参数传递、局部变量的分配…