当前位置: 首页 > news >正文

docker swarm 集群服务编排部署指南(docker stack)

Docker Swarm 集群管理

概述

Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

集群的管理和编排是使用嵌入到 docker 引擎的 SwarmKit,可以在 docker 初始化时启动 swarm 模式或者加入已存在的 swarm。

支持的工具包括但不限于以下各项:

  • Dokku
  • Docker Compose
  • Docker Machine
  • Jenkins

Docker Swarm 优点

  • 任何规模都有高性能表现

对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。

经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。

  • 灵活的容器调度

Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。

  • 服务的持续可用性

Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。

此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。

  • 和 Docker API 及整合支持的兼容性

Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。

  • Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持

开发的 Compose 文件能(通过 docker-compose up )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。

  • 集群模式,当修改了服务的配置后无需手动重启服务。并且只有集群中的manager才能管理集群中的一切(包括服务、容器都归它管,在一个woker节点上无法操作容器)

节点

swarm 集群由管理节点(manager)和工作节点(work node)构成。

  • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。

    为了利用swarm模式的容错功能,Docker建议根据组织的高可用性要求实现奇数个节点。当您拥有多个管理器时,您可以从管理器节点的故障中恢复而无需停机。

    • N个管理节点的集群容忍最多损失 (N-1)/2 个管理节点。
    • Docker建议一个集群最多7个管理器节点。
  • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。也可以通过配置让服务只运行在管理节点。

服务和任务

任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。

服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:

  • replicated services (复制服务)按照一定规则在各个工作节点上运行指定个数的任务。
  • global services (全局服务)每个工作节点上运行一个此任务。

两种模式通过 docker service create 的 --mode 参数指定。下图展示了容器、任务、服务的关系。

在这里插入图片描述

路由网格

service 通过 ingress load balancing 来发布服务,且 swarm 集群中所有 node 都参与到 ingress 路由网格(ingress routing mesh) 中,访问任意一个 node+PublishedPort 即可访问到服务。

当访问任何节点上的端口8080时,Docker将请求路由到活动容器。在群节点本身,端口8080可能并不实际绑定,但路由网格知道如何路由流量,并防止任何端口冲突的发生。

路由网格在发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。


Swarm 集群的搭建

准备工作

  • 二个或二个以上可以通过网络进行通信的Linux主机或虚拟机,并安装了Docker(加入开机自启),或者使用docker-machine 创建三台虚拟机。swarm 不需要单独安装,安装了 docker 就自带了该软件

  • 已安装Docker Engine 1.12或更高版本

  • 关闭所有主机上的防火墙或者开放以下端口:

    • TCP协议端口 2377 :集群管理端口

    • TCP协议端口 7946 :节点之间通讯端口(不开放则会负载均衡失效)

    • UDP协议端口 4789 :overlay网络通讯端口

    • 防火墙相关命令:

      # 查看firewalld防火墙状态
      systemctl status firewalld# 查看所有打开的端口 
      firewall-cmd --zone=public --list-ports# 防火墙开放端口(更新firewalld防火墙规则后生效)
      firewall-cmd --zone=public --add-port=要开放的端口/tcp --permanent
      # 选项:
      –zone 				# 作用域
      –add-port=80/tcp 	# 添加端口,格式为:端口/通讯协议
      –permanent 			#永久生效,没有此参数重启后失效
      # 示例:
      firewall-cmd --zone=public --add-port=3306/tcp --permanent# firewalld防火墙关闭接口(更新firewalld防火墙规则后生效)
      firewall-cmd --zone=public --remove-port=要关闭的端口/tcp --permanent# 更新firewalld防火墙规则(并不中断用户连接,即不丢失状态信息)
      firewall-cmd --reload# 启动firewalld防火墙
      systemctl start firewalld
      # 关闭firewalld防火墙:
      systemctl stop firewalld
      # 开机禁用firewalld防火墙
      systemctl disable firewalld
      # 开机启用firewalld防火墙: 
      systemctl enable firewalld
      
  • 分别修改机器的主机名,更改成 swarm01,swarm02 …

    hostnamectl set-hostname swarm01
    

创建docker swarm集群

1.master主机上初始化swarm。执行 docker swarm init 命令的节点自动成为管理节点。

docker swarm init# 注:如果主机有多个网卡,拥有多个IP,必须使用 --advertise-addr 指定 IP。
# 示例:
docker swarm init --advertise-addr 192.168.99.100
# 执行命令后会给出加入这个swarm的命令
Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

2.在node主机上执行命令加入swarm

docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377

3.查看集群信息。集群的大部分命令需要在管理节点中才能运行

# 查看 swarm 集群状态
docker info
# 查看集群节点信息
docker node ls

Swarm 集群管理常用命令

docker swarm:管理集群

# 初始化一个swarm
docker swarm init [OPTIONS]
# 选项:
--advertise-addr string		# 发布的地址(格式:<ip|interface>[:port])
--force-new-cluster			# 强制从当前状态创建一个新的集群(去除本地之外的所有管理器身份)
--cert-expiry duration		# 节点证书有效期(ns|us|ms|s|m|h)(默认为2160h0m0s)
--data-path-addr string     # 用于数据路径通信的地址或接口(格式: <ip|interface>)
--data-path-port uint32 	# 用于数据路径流量的端口号(1024 - 49151)。如果没有值,则默认端口号4789
--dispatcher-heartbeat duration		# 调度程序的心跳周期(ns|us|ms|s|m|h)(默认为5s)
--listen-addr node-addr		# 监听地址(格式: <ip|interface>[:port]) (默认 0.0.0.0:2377)# 查看加入节点到集群的命令及令牌(token)
docker swarm join-token [OPTIONS] (worker|manager)
# 选项:
-q, --quiet    # 只显示令牌--rotate   # 使旧令牌无效并生成新令牌
# 查看加入工作节点到集群的命令及令牌
docker swarm join-token worker
# 查看加入管理节点到集群的命令及令牌
docker swarm join-token manager# 将节点加入swarm集群,作为一个manager或worker
docker swarm join [OPTIONS] HOST:PORT
# 选项:
--advertise-addr string   # 发布的地址 (格式: <ip|interface>[:port])
--availability string     # 节点的可用性 ("active"|"pause"|"drain") (default "active")
--data-path-addr string   # 用于数据路径通信的地址或接口 (格式: <ip|interface>)
--listen-addr node-addr   # 监听地址 (格式: <ip|interface>[:port]) (default 0.0.0.0:2377)
--token string            # 进入的swarm集群的令牌     # 主动退出集群,让节点处于down状态(在需要退出Swarm集群的节点主机上执行命令)
docker swarm leave [OPTIONS]
# 选项:
-f, --force		# 强制。Manager若要退出 Swarm 集群,需要加上强制选项
## 移除一个work-node节点主机的完整步骤:
# 1.在管理节点上操作,清空work-node节点的容器。id 可以使用命令 docker node ls 查看
docker node update --availability drain [id]
# 2.在work-node节点主机上操作,退出集群
docker swarm leave
# 3,在管理节点上操作,删除work-node节点
docker node rm [id]
# 若想解散整个集群,则需先移除所有work-node节点主机,然后所有管理节点也退出集群# 更新 swarm 集群的配置
docker swarm update [OPTIONS]
# 选项:
--autolock							# 更改管理器自动锁定设置(true|false)
--cert-expiry duration         		# 节点证书有效期(ns|us|ms|s|m|h)(默认为2160h0m0s)
--dispatcher-heartbeat duration		# 调度程序心跳周期(ns|us|ms|s|m|h)(默认为5s)

docker node:管理swarm集群节点

# 查看集群中的节点
docker node ls
#选项:
-f, --filter filter   	# 根据所提供的条件过滤输出。(格式:key=value)# 目前支持的过滤器是:id, label, name, membership[=accepted|pending]# , role[manager|worker]
-q, --quiet				# 只显示id# 查看运行的一个或多个及节点任务数,默认当前节点
docker node ps [OPTIONS] [NODE...]
#选项:
-f, --filter filter   	# 根据所提供的条件过滤输出
-q, --quiet				# 只显示id# 将worker角色升级为manager
docker node promote NODE [NODE...]
# 将manager角色降级为worker
docker node demote NODE [NODE...]# 查看节点的详细信息,默认json格式
docker node inspect 主机名
# 查看节点信息平铺格式
docker node inspect --pretty 主机名# 从swarm中删除一个节点
docker node rm 主机名
# 从swarm中强制删除一个节点
docker node rm -f 主机名# 更新一个节点
docker node update [options] 主机名
# 选项
--label-add list		# 添加节点标签(key=value)
--label-rm list 		# 删除节点标签
--role string           # 更改节点角色 ("worker"|"manager")
--availability active/pause/drain	# 设置节点的状态# active  正常# pause   暂停。调度程序不向节点分配新任务,但是现有任务仍然保持运行# drain   排除自身work任务。调度程序不向节点分配新任务,且会关闭任何现有任务并在可用节点上安排它们

docker service:服务管理

# 列出服务列表
docker service ls# 列出服务任务信息
docker service ps [OPTIONS] SERVICE [SERVICE...]
# 选项:--no-trunc			# 显示完整的信息
-f, --filter filter   	# 根据所提供的条件过滤输出。过滤只运行的任务信息:"desired-state=running"
-q, --quiet				# 只显示任务id# 查看服务内输出
docker service logs [OPTIONS] SERVICE|TASK
# 选项:--details        # 显示提供给日志的额外细节
-f, --follow         # 跟踪日志输出--since string   # 显示自时间戳 (2013-01-02T13:23:37Z) 或相对时间戳 (42m for 42 minutes) 以来的日志
-n, --tail string    # 从日志末尾显示的行数(默认为“all”)
-t, --timestamps     # 显示时间戳# 更新服务的相关配置
docker service update [options] 服务名
# 选项
--args "指令"			# 容器加入指令
--image IMAGE		 # 更新服务容器镜像
--rollback				# 回滚服务容器版本
--network-add 网络名	  # 添加容器网络
--network-rm 网络名	  # 删除容器网络
--reserve-cpu int			# 更新分配的cpu
--reserve-memory bytes		# 更新分配的内存(示例:512m)
--publish-add 暴露端口:容器端口		# 映射容器端口到主机
--publish-rm 暴露端口:容器端口		# 移除暴露端口
--endpoint-mode dnsrr		 # 修改负载均衡模式为dnsrr
--force						 # 强制重启服务
--config-rm 配置文件名称		 # 删除配置文件
--constraint-add list		 # 新增一个约束 
--constraint-rm list		 # 移除一个约束 
--placement-pref-add pref	 # 新增一个偏好 
--placement-pref-rm pref	 # 移除一个偏好
--config-add 配置文件名,target=/../容器内配置文件名		# 添加新的配置文件到容器内# 查看服务详细信息,默认json格式
docker service inspect [OPTIONS] 服务名 [SERVICE...]
# 查看服务信息平铺形式
docker service inspect --pretty 服务名# 删除服务
docker service rm [OPTIONS] 服务名 [SERVICE...]# 缩容扩容服务容器副本数量
docker service scale 服务名=副本数 [SERVICE=REPLICAS...]# 创建一个服务。一般搭建好 Swarm 集群后,使用 docker stack 部署应用,此处仅作了解
docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 选项:
--name string			# 指定容器名称
--replicas int			# 指定副本数
--network 网络名		  # 添加网络组
--mode string			# 服务模式(复制或全局)(replicated | global)
--reserve-cpu int		# 预留的cpu
--reserve-memory bytes	# 预留的内存(512m)
--limit-cpu	int			# 限制CPU
--limit-memory bytes	# 限制内存(512m)
-l,	--label list			# 服务的标签(key=value)
--container-label list		# 容器标签(key=value)
-p, --publish 暴露端口:容器端口	  # 映射容器端口到主机
-e,	--env MYVAR=myvalue			# 配置环境变量
-w,	--workdir string			# 指定工作目录(示例:/tmp)
-restart-condition string		# 满足条件时重新启动(no | always | on-failure | unless-stopped)
--restart-delay duration		# 重新启动尝试之间的延迟 (ns/us/ms/s/m/h)
--restart-max-attempts int		# 放弃前的最大重启次数
--restart-window duration			# 用于评估重启策略的窗口 (ns/us/ms/s/m/h)
--stop-grace-period duration		# 强制杀死容器前的等待时间 (ns/us/ms/s/m/h)
--update-delay duration				# 更新之间的延迟(ns/us/ms/s/m/h)(默认 0s)
--update-failure-action	string		# 更新失败的操作("pause"停止|"continue"继续)(默认pause)
--update-max-failure-ratio float	# 更新期间容忍的失败率
--update-monitor duration			# 每次任务更新后监控失败的持续时间(ns/us/ms/s/m/h)(默认 0s)
--update-parallelism int			# 同时更新的最大任务数(0表示一次更新全部任务)(默认为1)  
--endpoint-mode string				# 负载均衡模式(vip or dnsrr) (默认 "vip")
--rollback-monitor 20s		  	    # 每次容器与容器之间的回滚时间间隔
--rollback-max-failure-ratio .数值	# 回滚故障率如果小于百分比允许运行(“.2”为%20)
--mount type=volume,src=volume名称,dst=容器目录	 # 创建volume类型数据卷
--mount type=bind,src=宿主目录,dst=容器目录			# 创建bind读写目录挂载
--mount type=bind,src=宿主目录,dst=容器目录,readonly	 # 创建bind只读目录挂载
--config source=docker配置文件,target=配置文件路径		# 创建docker配置文件到容器本地目录

docker config:管理配置文件

# 查看已创建配置文件
docker config ls [OPTIONS]
# 选项:
-f, --filter filter   	# 根据所提供的条件过滤输出
-q, --quiet				# 只显示id# 查看配置详细信息
docker config inspect 配置文件名# 删除配置
docker config rm CONFIG [CONFIG...]# 创建配置文件
docker config create 配置文件名 本地配置文件
# 示例:新建配置文件并添加新配置文件到服务
# 1.创建配置文件
docker config create nginx2_config nginx2.conf 
# 2.删除旧配置文件
docker service update --config-rm ce_nginx_config 服务名
# 3.添加新配置文件到服务
ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx

docker network:管理网络

# 查看集群网络列表
docker network ls# 将容器连接到集群网络中
$ docker network connect [OPTIONS] NETWORK CONTAINER
# 选项--alias strings				# 为容器添加网络范围的别名--driver-opt string		·	# 指定网络驱动程序--ip string					# 指定IPv4地址(如172.30.100.104)--ip6 string				# 指定IPv6地址(例如,2001:db8::33)--link list					# 添加到另一个容器的链接--link-local-ip string		# 为容器添加一个链接本地地址
# 示例
docker network connect mynet nginx# 断开一个容器与集群网络的连接
$ docker network disconnect [OPTIONS] NETWORK CONTAINER
# 选项-f, --force		# 强制容器从网络断开连接  # 显示一个或多个集群网络的详细信息
$ docker network inspect [OPTIONS] NETWORK [NETWORK...]
# 选项-f, --format string   # 使用给定的Go模板格式化输出-v, --verbose         # 输出详细的诊断信息# 创建一个集群网络
$ docker network create [OPTIONS] NETWORK
# 选项--attachable           # 准许手动容器连接--aux-address map      # 网络驱动使用的辅助IPv4或IPv6地址(默认映射[])--config-from string   # 要从其中复制配置的网络--config-only          # 创建仅配置网络-d, --driver string        # 管理网络的驱动程序(默认为“"bridge”)。选项:bridge、overlay、macvlan--gateway strings      # 指定IPv4或IPv6主子网网关。示例:172.20.0.1--ingress              # 创建群路由-网格网络--internal             # 限制外部访问网络--ip-range strings     # 从子范围分配容器ip--ipam-driver string   # IP管理驱动(默认为“default”)--ipam-opt map         # 设置IPAM驱动程序的特定选项(默认map[])--ipv6                 # 启用IPv6网络--label list           # 在网络中设置元数据-o, --opt map              # 设置驱动程序特定选项(默认map[])--scope string         # 控制网络的范围--subnet strings       # 指定一个CIDR格式的网段。示例:172.20.0.0/24
# 示例:
docker network create -d overlay --attachable apps_net# 移除所有未使用的集群网络
$ docker network prune [OPTIONS]
# 选项--filter filter   # 提供过滤值(e.g. 'until=<timestamp>') -f, --force           # 强制,没有提示确认# 删除一个或多个集群网络
$ docker network rm NETWORK [NETWORK...]
# 别名:rm, remove

docker secret:管理敏感数据存储

# 查看敏感数据卷列表
$ docker secret ls# 显示一个或多个敏感数据卷的详细信息
$ docker secret inspect [OPTIONS] SECRET [SECRET...]
# 选项--pretty		# 易读的格式打印信息# 从文件或标准输入创建一个敏感数据卷作为内容
$ docker secret create [OPTIONS] SECRET [file|-]
# 选项-d, --driver string            # 指定驱动-l, --label list               # 指定标签--template-driver string   # 指定模板驱动程序# 移除一个或多个敏感数据卷
$ docker secret rm SECRET [SECRET...]
# 别名:rm, remove

docker网络管理

参考:

  • docker的3种自定义网络(bridge、overlay、macvlan)
  • Docker Swarm - 网络管理
  • Docker的网络模式bridge、host、container 、overlay

概述

Docker 提供三种 user-defined 网络驱动:bridge,overlay 和 macvlan

overlay 和 macvlan 用于创建跨主机的网络

Swarm 集群产生两种不同类型的流量:

  • 控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开Swarm,这种类型的流量总是被加密的。(涉及到集群内部的hostname、ip-address、subnet、gateway等)
  • 应用数据层面:包括容器与客户端的通信等。(涉及到防火墙、端口映射、网口映射、VIP等)

在 Swarm Service 中有三个重要的网络概念:

  • Overlay networks :管理 Swarm 中 Docker 守护进程间的通信。可以将服务附加到一个或多个已存在的 overlay 网络上,使得服务与服务之间能够通信。
  • ingress network :是一个特殊的 overlay 网络,用于服务节点间的负载均衡,处理与群集服务相关的控制和数据流量。当任何 Swarm 节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有IP地址,选择其中的一个,并通过 ingress 网络将请求路由到它。
    初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本允许你自定义。
  • docker_gwbridge :是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。
    docker_gwbridge 网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。

在这里插入图片描述

在管理节点上查看网络

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
cb0ccb89a988        bridge              bridge              local
0174fb113496        docker_gwbridge     bridge              local
541b62778c0e        host                host                local
8n7xppn5z4j2        ingress             overlay             swarm
369d459f340d        none                null                local

overlay网络驱动程序会创建多个Docker守护主机之间的分布式网络。该网络位于(覆盖)特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地进行通信。Docker透明地处理每个数据包与正确的Docker守护程序主机和正确的目标容器的路由。

自定义overlay 网络

创建用于swarm服务的自定义的overlay网络 命令:

docker network create -d overlay --attachable my-overlay# 注:overlay 网络创建可以在 Swarm 集群下的任意节点执行,并同步更新到所有节点。

集群中部署了两个服务 nginx、alpine,现在我们进入alpine,去访问nginx。

$ docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash
$ ping nginx
ping: bad address 'nginx'$ wget 192.168.99.100:8080
Connecting to 192.168.99.100:8080 (192.168.99.100:8080)
index.html           100% |**********************************************************************************************************|   612   0:00:00 ETA

发现集群中的各个服务不能用名称访问的,只能用集群服务发现的路由网络访问,若需要集群中的服务能通过名称进行访问,这就需要用到上面自定义的 overlay 网络。

删除启动的服务,重新创建指定使用自定义网络的服务。

docker service rm nginx alpine
docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx
docker service create --name alpine --network my-overlay alpine ping www.baidu.com

进入alpine容器中,重新测试下:

$ ping nginx
PING nginx (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms
$ wget nginx
Connecting to nginx (10.0.0.2:80)
index.html           100% |**********************************************************************************************************|   612   0:00:00 ETA

发现可以通过名称进行集群中的容器间的访问了。


Docker Stack 部署应用

概述

单机模式下,可以使用 Docker Compose 来编排多个服务。Docker Swarm 只能实现对单个服务的简单部署。而Docker Stack 只需对已有的 docker-compose.yml 配置文件稍加改造就可以完成 Docker 集群环境下的多服务编排。

stack是一组共享依赖,可以被编排并具备扩展能力的关联service。


Docker Stack和Docker Compose区别

  • Docker stack 会忽略了“构建”指令,无法使用 stack 命令构建新镜像,它是需要镜像是预先已经构建好的。 所以 docker-compose 更适合于开发场景;
  • Docker Compose 是一个 Python 项目,在内部,它使用 Docker API 规范来操作容器。所以需要安装 Docker -compose,以便与 Docker 一起在计算机上使用;Docker Stack 功能包含在 Docker 引擎中。你不需要安装额外的包来使用它,docker stacks 只是 swarm mode 的一部分。
  • Docker stack 不支持基于第2版写的 docker-compose.yml ,也就是 version 版本至少为3。然而 Docker Compose 对版本为2和 3 的文件仍然可以处理;
  • docker stack 把 docker compose 的所有工作都做完了,因此 docker stack 将占主导地位。同时,对于大多数用户来说,切换到使用
  • 单机模式(Docker Compose)是一台主机上运行多个容器,每个容器单独提供服务;集群模式(swarm + stack)是多台机器组成一个集群,多个容器一起提供同一个服务;

compose.yml deploy 配置说明

docker-compose.yaml 文件中 deploy 参数下的各种配置主要对应了 swarm 中的运维需求。

docker stack deploy 不支持的参数:

(这些参数,就算yaml中包含,在stack的时候也会被忽略,当然也可以为了 docker-compose up 留着这些配置)

build
cgroup_parent
container_name
devices
tmpfs
external_links
links
network_mode
restart
security_opt
userns_mode

deploy:指定与服务的部署和运行有关的配置。只在 swarm 模式和 stack 部署下才会有用。且仅支持 V3.4 及更高版本。

可以选参数:

  • endpoint_mode:访问集群服务的方式。3.2版本开始引入的配置。用于指定服务发现,以方便外部的客户端连接到swarm

    • vip:默认的方案。即通过 Docker 集群服务一个对外的虚拟 ip对外暴露服务,所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器,客户端无法察觉有多少个节点提供服务,也不知道实际提供服务的IP和端口。
    • dnsrr:DNS的轮询调度。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。客户端访问的时候,Docker集群会通过DNS列表返回对应的服务一系列IP地址,客户连接其中的一个。这种方式通常用于使用自己的负载均衡器,或者window和linux的混合应用。
  • labels:在服务上设置标签,并非附加在service中的容器上。如果在容器上设置标签,则在deploy之外定义labels。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。

  • mode:用于指定是以副本模式(默认)启动还是全局模式

    • replicated:副本模式,复制指定服务到集群的机器上。默认。
    • global:全局模式,服务将部署至集群的每个节点。类似于k8s中的DaemonSet,会在每个节点上启动且只启动一个服务。
  • replicas:用于指定副本数,只有mode为副本模式的时候生效。

  • placement:主要用于指定约束偏好。这个参数在运维的时候尤为关键

    • constraints(约束):表示服务可以部署在符合约束条件的节点上,包含了:

      node attributematchesexample
      node.id节点idnode.id == 2ivku8v2gvtg4
      node.hostname节点主机名node.hostname != node-2
      node.role节点角色 (manager/worker)node.role == manager
      node.platform.os节点操作系统node.platform.os == windows
      node.platform.arch节点架构node.platform.arch == x86_64
      node.labels用户定义的labelsnode.labels.security == high
      engine.labelsDocker 引擎的 labelsengine.labels.operatingsystem == ubuntu-14.04
    • preferences(偏好):表示服务可以均匀分布在指定的标签下。

    • preferences 只有一个参数,就是spread,其参数值为节点的属性,即约束表中的内容

      例如:node.labels.zone这个标签在集群中有三个值,分别为west、east、north,那么服务中的副本将会等分为三份,分布到带有三个标签的节点上。

    • max_replicas_per_node:3.8版本中开始引入的配置。控制每个节点上最多的副本数。

      注意:当 最大副本数*集群中可部署服务的节点数<副本数,会报错

  • resources:用于限制服务的资源,这个参数在运维的时候尤为关键。

    示例:配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。

    • limit:用于限制最大的资源使用数量
      • cpus:cpu占比,值的格式为百分比的小数格式
      • memory:内存的大小。示例:512M
    • reservation:为最低的资源占用量。
      • cpus
      • memory
  • restart_policy:容器的重启策略

    • condition:重启的条件。可选 none,on-failure 或者 any。默认值:any
    • delay:尝试重启的时间间隔(默认值:5s)。
    • max_attempts:最大尝试重启容器的次数,超出次数,则不再尝试(默认值:一直重试)。
    • window:判断重启是否成功之前的等待时间(一个总的时间,如果超过这个时间还没有成功,则不再重启)。
  • rollback_config:更新失败时的回滚服务的策略。3.7版本加入。和升级策略相关参数基本一致。

  • update_config:配置应如何更新服务,对于配置滚动更新很有用。

    • parallelism:同时升级[回滚]的容器数
    • delay:升级[回滚]一组容器的时间间隔
    • failure_action:若更新[回滚]失败之后的策略:continue、 pause、rollback(仅在update_config中有) 。默认 pause
    • monitor:容器升级[回滚]之后,检测失败的时间检测 (支持的单位:ns|us|ms|s|m|h)。默认为 5s
    • max_failure_ratio:最大失败率
    • order:升级[回滚]期间的操作顺序。可选:stop-first(串行回滚,先停止旧的)、start-first(并行回滚,先启动新的)。默认 stop-first 。注意:只支持v3.4及更高版本

compose.yml 文件示例

version: "3"		# 版本号,deploy功能是3版本及以上才有的
services:			# 服务,每个服务对应配置相同的一个或者多个docker容器redis:			# 服务名,自取image: redis:alpine		# 创建该服务所基于的镜像。使用stack部署,只能基于镜像ports: 			# 容器内外的端口映射情况- "1883:1883"- "9001:9001"networks:		# 替代了命令行模式的--link选项- fiwarevolumes: 		# 容器内外数据传输的对应地址- "/srv/mqtt/config:/mqtt/config:ro"- "/srv/mqtt/log:/mqtt/log"- "/srv/mqtt/data/:/mqtt/data/"command: -dbhost stack_mongo # 命令行模式中跟在最后的参数,此条没有固定的格式,建议参照所部署的docker镜像的说明文档来确定是否需要该项、需要写什么deploy:mode: replicatedreplicas: 6			# replicas模式, 副本数目为1endpoint_mode: viplabels: description: "This redis service label"resources:limits:cpus: '0.50'memory: 50Mreservations:cpus: '0.25'memory: 20Mrestart_policy:condition: on-failuredelay: 5smax_attempts: 3window: 120splacement:constraints:- "node.role==worker"		# 部署位置,只在工作节点部署- "engine.labels.operatingsystem==ubuntu 18.04"preferences:- spread: node.labels.zoneupdate_config:parallelism: 2delay: 10sorder: stop-firstnetworks:		 # 定义部署该项目所需要的网络fiware:

stack 常用命令

docker stack:编排部署应用

# 部署一个新的stack(堆栈)或更新现有的stack。别名:deploy, up
docker stack deploy [OPTIONS] 自定义STACK名称
# 选项:
-c, --compose-file strings		# Compose文件的路径,或从标准输入中读取的“-”
--prune						# 表示削减不再引用的服务。可以把一些down掉的service进行自动清理。
--orchestrator string		# 指定编排模式 (swarm|kubernetes|all)
--resolve-image	string		# 请求仓库来重新解析镜像的摘要和支持的平台。("always"|"changed"|"never") (默认 "always")
--with-registry-auth		# 发送仓库的授权详情到Swarm代理
--orchestrator				# 使用的容器编排服务# 通过compose.yml文件指令部署
docker stack deploy -c 文件名.yml 自定义STACK名称# 列出现有堆栈。别名:ls, list
docker stack ls [OPTIONS]# 列出堆栈中的任务
docker stack ps [OPTIONS] STACK
# 选项:
--no-trunc		# 输出完整信息# 删除一个或多个堆栈。别名:rm, remove, down
docker stack rm [OPTIONS] STACK [STACK...]
# 选项--orchestrator string   # 指定适配器 (swarm|kubernetes|all)# 列出堆栈中的服务
docker stack services [OPTIONS] STACK

相关文章:

docker swarm 集群服务编排部署指南(docker stack)

Docker Swarm 集群管理 概述 Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机&#xff0c;使得容器可以组成跨主机的子网网络。Docker Swarm 提供了标准的 Docker API&#xff0c;所有任何已经与 Docker 守护程序通信的工具都可以使用…...

ESP开发环境搭建

一、windows中搭建 esp-idf tool(可选),下载连接如下:https://dl.espressif.com/dl/esp-idf/?idf4.4 下载安装tools后进入vscode进行插件安装&#xff08;未离线下载idf工具也可以通过第二步通过插件下载安装&#xff09; 1. vscode安装编译环境 ESP-IDF 需要安装一些必备工…...

内网安全——ssH协议WindowsLinux密码获取hashcat

目录 (一)横向移动-Linux把场-ssH协议&RSA密匙凭证 (二)Windows-密码获取-在线离线读取&密文破解&a...

【编程入门】应用市场(安卓版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…...

【图像分类】卷积神经网络之LeNet5网络模型结构详解

写在前面: 首先感谢兄弟们的关注和订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 1. 前言 LeNet5算法是LeCun在1998年提出的卷积神经网络模型。大约90年代,由于支持向量机等算法的发现,深度学习…...

2023-JavaWeb最新整理面试题-TCP、Tomcat、Servlet、JSP等

Java基础面试题 一、JavaWeb专题 1.HTTP响应码有哪些 1、1xx&#xff08;临时响应&#xff09; 2、2xx&#xff08;成功&#xff09; 3、3xx&#xff08;重定向&#xff09;&#xff1a;表示要完成请求需要进一步操作 4、4xx&#xff08;错误&#xff09;&#xff1a;表示请…...

【云原生kubernetes】k8s Ingress使用详解

一、什么是Ingress 在上一篇关于k8s之service的使用一篇中提到&#xff0c;Service对集群之外暴露服务的主要方式有两种&#xff0c;NotePort和LoadBalancer&#xff0c;但这两种方式&#xff0c;都有一定的缺点&#xff0c;具体来说&#xff1a; NodePort 会占用很多集群机器…...

[数据结构]:顺序表(C语言实现)

目录 前言 顺序表实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-SeqListCommon.cpp 04-SeqListPositionOperation.cpp 05-SeqListValueOperation.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为…...

【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~

有序矩阵中第 K 小的元素 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2) 的解决方案。 示例 1: 输入:matrix = [[1,5,9…...

两年外包生涯做完,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…...

02- OpenCV绘制图形及图像算术变换 (OpenCV基础) (机器视觉)

知识重点 OpenCV用的最多的色彩空间是HSV. 方便OpenCV做图像处理img2 img.view() # 浅拷贝img3 img.copy() # 深拷贝split(mat) 分割图像的通道: b, g, r cv2.split(img) # b, g, r 都是数组merge((ch1, ch2, ch3)) 融合多个通道cvtColor(img, colorspace): 颜…...

猜数字大小 II

力扣链接 力扣 题目描述&#xff1a; 我们正在玩一个猜数游戏&#xff0c;游戏规则如下&#xff1a; 我从 1 到 n 之间选择一个数字。你来猜我选了哪个数字。如果你猜到正确的数字&#xff0c;就会 赢得游戏 。如果你猜错了&#xff0c;那么我会告诉你&#xff0c;我选的数…...

CCNP350-401学习笔记(251-300题)

251、 Which IPv6 OSPF network type is applied to interface Fa0/0 of R2 by default? A. multipointB. broadcast C. Ethernet D. point-to-point 252、Which EIGRP feature allows the use of leak maps? A. neighborB. Stub C. offset-list D. address-family 253、W…...

掌握MySQL分库分表(二)Mysql数据库垂直分库分表、水平分库分表

文章目录垂直分表拆分方法举例垂直分库水平分表水平分库小结垂直角度&#xff08;表结构不一样&#xff09;水平角度&#xff08;表结构一样&#xff09;垂直分表 需求&#xff1a;商品表字段太多&#xff0c;每个字段访问频次不⼀样&#xff0c;浪费了IO资源&#xff0c;需要…...

算法训练营 day50 动态规划 单词拆分 多重背包理论基础

算法训练营 day50 动态规划 单词拆分 多重背包理论基础 单词拆分 139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词…...

一文3000字用Postman从0到1实现UI自动化测试

“阅读本文大概需要4分钟。Postman不是做接口测试的吗&#xff1f;为什么还能做UI自动化测试呢&#xff1f; 其实&#xff0c;只要你了解Selenium的运行原理&#xff0c;就可以理解为什么Postman也能实现UI自动化测试了。 Selenium底层原理 运行代码&#xff0c;启动浏览器后…...

2023年美国大学生数学建模C题:预测Wordle结果建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析 字段含义: 建模要求 二、建模思路...

spring-boot 整合 前端框架 React 增删改查(附源码)

看了很多 关于 SpringBoot 增删改查 的文章 &#xff0c;但是 React 前端框架这块似乎没什么人玩&#xff0c;一般都是Vue进行整合 &#xff0c;所以想写一篇关于 React 整合 SpringBoot 增删改查的项目 React 学习区域 React中文教程: https://www.php.cn/doc/react/tutorial/…...

未来的城市:智慧城市定义、特征、应用、场景

智慧城市是通过连接一个地区的物理、经济和社会基础设施&#xff0c;以创新、有效和高效的方式应用和实施技术来发展城市的概念&#xff0c;以改善服务并实现更好的生活质量。智慧城市是一个将信息和通信技术融入日常治理的城市区域&#xff0c;旨在实现效率、改善公共服务、增…...

Qt线程池QThreadPool使用示例

目录前言1.线程池原理介绍2.QThreadPool详细介绍反复执行同一个任务设置线程过期时间线程数量信息3.QThreadPool示例4.总结前言 线程池顾名思义就是同时管理多个线程的"池子"&#xff0c;它是一种并发处理技术&#xff0c;在程序中使用线程池能够提高线程的使用效率…...

【Spring】难理解的Aop编程 | 入门?

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《spring开发》 坚持做好每一步&#xff0c;幸运之神自然会驾凌在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 常见概念2.1 常见术语2.2 AOP入门Ⅰ. &#x1f407; 功能场景Ⅱ. &#x1f407; 实现过程2.3 通知类型Ⅰ.…...

2 月 25 日,论道京城 | 云原生开源项目应用实践报名开启

在数字化转型的浪潮中&#xff0c;云原生已经逐渐成为人们关注的焦点。开源社区作为云原生技术创新的根据地&#xff0c;为云原生的产业发展打造了丰富的技术生态圈&#xff0c;也在广泛的实践中源源不断地创造着新的机遇。想知道云原生存储技术实现了怎样的突破吗&#xff1f;…...

第五、六章 贪心算法、回溯算法

贪心算法 适合于贪心算法求解的问题具有&#xff1a;贪心选择性质、最优子结构性质。 贪心算法可以获取到问题的局部最优解&#xff0c;不一定能获取到全局最优解。 贪心算法总是作出在当前看来最好的选择&#xff1b;并且每次贪心选择都能将问题化简为一个更小的与原问题具有…...

k8s-kubectl命令

文章目录一、kubectl 基本命令1、陈述式资源管理方法:2、声明式资源管理办法二、基本信息查看三、项目的生命周期创建kubectl run命令四、金丝雀发布(Canary Release)——陈述式管理方法五、声明式管理方法kubectl create 和 kubectl apply区别一、kubectl 基本命令 1、陈述式…...

36、基于51单片机频率计 LCD 1602显示系统设计

摘要 数字频率计是一种基本的测量仪器。它被广泛应用于航天、电子、测控等领域&#xff0c;还被应用在计算机及各种数学仪表中。一般采用的是十进制数字&#xff0c;显示被测信号频率。基本功能是测量正弦信号&#xff0c;方波信号以及其他各种单位时间内变坏的物理量。由于其…...

【vue】elemente-ui table toggleRowSelection 默认选择无效[已解决]

项目场景&#xff1a; 点击按钮&#xff0c;弹出一个弹出框&#xff0c;内部出现一个table表&#xff0c;表内数据是动态获取&#xff0c;同时得勾选上几个table表的数据&#xff0c;类似以下的图 问题描述 点击按钮显示弹出框&#xff0c;加载table中的数据&#xff0c;默…...

SpringMVC DispatcherServlet源码(5) HttpMessageConverter扩展

前文通过阅读源码&#xff0c;深入分析了DispatcherServlet及相关组件的工作流程&#xff0c;本文不再阅读源码&#xff0c;介绍一下扩展HttpMessageConverter的方式。 HttpMessageConverter工作方式及扩展方式 前文介绍过&#xff0c;HttpMessageConverter是读写请求体和响应…...

day16_API

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、String 三、StringBuffer&StringBuilder 四、日期 零、 复习昨日 见晨考 一、String String代表字符串,类,java程序中的所有字符串&…...

十二月券商金工精选

✦研报目录✦ ✦简述✦ 按发布时间排序 华宝证券 主动暴露的得与失—从Barra框架到私募指增因子分析方法 发布日期&#xff1a;2022-12-01 关键词&#xff1a;股票、Barra、风险暴露、指数增强 主要内容&#xff1a;本文针对私募指数增强产品的策略流程&#xff0c;设计…...

JUnit

Junit 简介 JUnit是一个开源的java单元测试框架&#xff0c;它是XUnit测试体系架架构的一种体现 是Java语言事实上的标准单元测试库真正的优势来自于JUnit所采作用的思想和技术&#xff0c;而不是框架本身。推动了单元测试、测试先行的编程和测试驱动的开发JUnit衍生了许多xUn…...

用java做网站还是html/免费网站制作教程

在获取房间号之前我们先解决上篇文章遗留的bug&#xff0c;即输入的房间号不是数字和对应的房间号不存在而产生的问题。 输入的房间号不是数字&#xff1a; 在python中&#xff0c;你所输入的必定是字符串&#xff0c;虽然你输入的是数字&#xff0c;但是类型还是str。 roomId …...

wordpress 打开非常慢/关键词排名怎样

今天在虚拟机上装了雨林木风 Ghost XP SP3 装机版 YN9.9在菜单上发现了 安装WinPE到硬盘 选项 没接触过WinPE Windows PE Windows PreInstallation Environment&#xff08;Windows PE&#xff09;直接从字面上翻译就是“Windows预安装环境”&#xff0c;微软在2002年7月22日发…...

我想给别人做网站/网站排名优化专业定制

Hibernate中的一对一映射关系有两种实现方法&#xff08;单向一对一&#xff0c;和双向一对一)&#xff08;一对一关系&#xff1a;例如一个department只能有一个manager&#xff09; 单向和双向有什么区别呢&#xff1f;&#xff1f;例如若是单向一对一&#xff0c;比如在depa…...

wordpress站长邮箱/网络营销的方法有哪些

一般的超算的拓扑结构是若干个登陆节点若干个交换机大量计算CPU节点大量GPU计算节点一个&#xff08;或若干个&#xff09;存储节点管理节点。[1]其中存储节点的共享存储可以被所有节点访问。一般运作方式是&#xff0c;如果我的计算依赖非常共性的软件&#xff0c;我可以找超算…...

网站后台如何上传附件/新网站应该怎么做seo

大家好&#xff0c;我是本期的实验室研究员——李卫涵。今天我将向大家介绍如何基于针对 Source Generator 来进行单元测试。接下来就让我们一起到实验室中一探究竟吧&#xff01; Source Generator 单元测试 Intro Source Generator 是 .NET 5.0 以后引入的一个在编译期间动态…...

郑州做网站哪家便宜/安卓神级系统优化工具

问题 最近服务器上面出现如下安全问题&#xff1a; 允许Traceroute探测ICMP timestamp请求响应漏洞 解决 允许Traceroute探测 firewall-cmd --get-icmptypes firewall-cmd --add-icmp-blocktime-exceeded --permanentICMP timestamp请求响应漏洞 firewall-cmd --add-icmp…...