Docker Stack基础命令及编排

754 阅读4分钟

简介

当 Docker 引擎以 Swarm 模式运行,我们可以通过docker stack deploy命令来部署一个完整的应用程序栈到 Swarm 中。deploy命令会接受并处理栈描述形式的 Compose 文件。

docker stack

用于管理 Docker Swarm 栈。
命令格式:docker stack [OPTIONS] COMMAND

docker stack deploy

部署新的栈或更新已存在的栈。
命令格式:docker stack deploy [OPTIONS] STACK
--compose-file, -c,Compose 文件的路径。

docker stack deploy --compose-file docker-stack.yml boot

docker stack deploy -c docker-compose.yml boot

Creating network boot_boot
Creating service boot_app
Creating service boot_admin

docker stack ls

列出栈。
命令格式:docker stack ls [OPTIONS]

docker stack ls boot

NAME   SERVICES   ORCHESTRATOR
boot   2          Swarm

docker stack ps

列出栈中的 task。
命令格式:docker stack ps [OPTIONS] STACK

docker stack ps boot

ID             NAME             IMAGE            NODE             DESIRED STATE   CURRENT STATE               ERROR                              PORTS
9rn259mfjdq4   boot_admin.1     jre8:4.0-arm64   docker-desktop   Running         Running 31 minutes ago                                         
z6fi4abxqxzb   boot_app.1       jre8:4.0-arm64   docker-desktop   Running         Starting 27 seconds ago                                        

docker stack rm

删除一个或多个栈。
此命令会删除指定栈的所有服务和网络。
命令格式:docker stack rm [OPTIONS] STACK [STACK...]

docker stack rm boot

Removing service boot_admin
Removing service boot_app
Removing network boot_boot

docker stack services

列出栈中的服务。
命令格式:docker stack services [OPTIONS] STACK

docker stack services boot

ID             NAME         MODE         REPLICAS   IMAGE            PORTS
v24x1b7yjyf1   boot_admin   replicated   1/1        jre8:4.0-arm64   *:8080->8080/tcp
m6lviprezz7c   boot_app     replicated   0/1        jre8:4.0-arm64   *:8081->8081/tcp

栈的部署编排

在 Docker Swarm 模式中,通过docker stack deploy就可以将一个完整的应用程序栈部署到 Swarm中。docker stack deploy命令使用3.x版本格式的 Compose 编排。

endpoint_mode

endpoint_mode用于指定外部客户端向服务连接通信的服务发现方式。默认的可用值由平台指定,当然 Compose 中也定义了两个标准值。

  • endpoint_mode: vip,分配一个 VIP (虚拟 IP) 给服务。VIP 担任着类似前端的职责,让网络中的客户端能够连通到服务。平台将客户端的请求路由到节点的服务,而无需客户端知晓有多少节点服务参与其中或者目标 IP 地址和端口。
  • endpoint_mode: dnsrr,平台会为服务配置 DNS 记录。DNS 将查询到的服务名返回 IP 地址列表 (通过 DNS round-robin,一种负载均衡),客户端就能够直接连接到其中。

mode

mode定义了平台中服务的运行模式,global全局式(每个物理节点一个容器)或者replicated复制式(指定数量的容器)。默认值为replicated

replicas

如果服务为replicated式(默认值),replicas则可以指定容器数量(预期应当运行的数量)。

restart_policy

restart_policy,重启策略用于配置是否或如何重启容器,在容器退出时。

  • condition,取noneon-failure或者any(默认值)其一。
  • delay,尝试重启的等待间隔。
  • max_attempts,尝试重启容器的次数。如果在window窗口内重启失败,那么此次尝试将不会计数。比如说,假设max_attempts设置为2,第一次尝试重启失败(在窗口时间内),那么必会有2次以上的重启尝试机会。
  • window,在判断某次重启是否成功前的等待时间。

rollback_config

rollback_config,回滚策略用于配置服务如何回滚,一旦服务更新失败。

  • parallelism,一次回滚时的容器数量。如果设置为0,则所有容器同时回滚。
  • delay,每组容器回滚的等待间隔。
  • failure_action,回滚失败时的操作。取continuepause(默认值)其一。
  • monitor,每次 task 更新后对失败的监视时间 (ns | us | ms | s | m | h,默认 0s)。
  • max_failure_ratio,回滚期间可容忍的失败率。
  • order,回滚时的操作顺序。取stop-first(旧 task 先停止,再启动新的,默认值)或start-first(新 task 先启动,此时运行中的 task 会短暂重叠存在)其一值。

update_config

update_config,更新策略用于配置服务如何更新。这对于配置滚动更新很有用。

  • parallelism,一次更新时的容器数量。
  • delay,每组容器更新的等待间隔。
  • failure_action,更新失败时的操作。取continuerollbackpause(默认值)其一。
  • monitor,每次 task 更新后对失败的监视时间 (ns | us | ms | s | m | h,默认 0s)。
  • max_failure_ratio,更新期间可容忍的失败率。
  • order,更新时的操作顺序。取stop-first(旧 task 先停止,再启动新的,默认值)或start-first(新 task 先启动,此时运行中的 task 会短暂重叠存在)其一值。

栈的编排示例

services:
  wei-app:
    image: jre8:4.0
    deploy:
      mode: replicated # 复制式服务
      replicas: 2 # 总共存在两个 wei-app 服务实例
      endpoint_mode: vip # 默认值
      restart_policy:
        condition: on-failure
        delay: 5s # 容器重启的间隔时间
        max_attempts: 3 # 最大尝试重启次数
        window: 120s # 窗口时间,可以用于缓冲服务容器重启失败的计数
      rollback_config:
        parallelism: 1 # 同时回滚的容器数量
        order: start-first # 先启动新容器,再停掉旧容器
      update_config:
        parallelism: 1 # 同时更新的容器数量
        order: start-first # 先启动新容器,再停掉旧容器

参考

[1] docker stack
[2] Compose file deploy reference
[3] Compose file version 3 reference