简介
当 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,取
none、on-failure或者any(默认值)其一。 - delay,尝试重启的等待间隔。
- max_attempts,尝试重启容器的次数。如果在
window窗口内重启失败,那么此次尝试将不会计数。比如说,假设max_attempts设置为2,第一次尝试重启失败(在窗口时间内),那么必会有2次以上的重启尝试机会。 - window,在判断某次重启是否成功前的等待时间。
rollback_config
rollback_config,回滚策略用于配置服务如何回滚,一旦服务更新失败。
- parallelism,一次回滚时的容器数量。如果设置为0,则所有容器同时回滚。
- delay,每组容器回滚的等待间隔。
- failure_action,回滚失败时的操作。取
continue、pause(默认值)其一。 - 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,更新失败时的操作。取
continue、rollback或pause(默认值)其一。 - 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