背景
回顾docker-compose vs docker stack差异:
① docker-compose是docker引擎之外的容器编排工具(Python实现),需要单独安装;docker stack 是docker引擎原生支持的容器编排技术(Go实现)
② 两者都支持最新docker-compose.yml 版本3容器编排文件,部分指令有差异。
③ docker-compose 能现场Build镜像,更适用于开发、测试时候单机迭代部署;docker stack须预先准备镜像,具备生产环境诸多特性。
为提高项目服务可用性评价值(SLA),决心从docker-compose切换到docker stack生产部署。
头脑风暴
docker swarm 集群部署有如下优点和特性:
业务模型角度
【Stack、Service、Container模型】定义了适用于生产的应用架构(支持副本集、重启策略、滚动更新、更新、回滚策略)
部署模型角度
Docker Swarm以多主机模型支撑业务,对于开发者来说, 一个节点或多节点部署的配置流程是类似的。
Docker Swarm有3个重要的网络概念:
① overlay network:覆盖物网络,在Docker宿主机底层网络之上搭建的分布式网络, 支撑不同主机之间容器的通信。
在初始化或刚加入Swarm集群时,会创建以下ingress、docker-gwbridge网络
② ingress network:入口网络,是一种特殊的overlay网络,外部客户端访问集群暴露的服务,在入口负载均衡(存在Swarm loadbancer将请求路由到可用节点容器)。
③ docker-gwbridge: 将overlay网络上容器连接到docker宿主机的网络。
以上可选配置都可以在docker-compose.yml 版本3官方文档找到对应的配置字段:
deploy: endpoint_mode: 服务发现的方式:vip、 dnsrr labels:为服务指定的标签 mode:replicated、global replicas:实例数量 resources:配置资源 restart_policy:重启策略 update_config: 服务更新策略 parallelism:同时更新容器数量 delay:容器组更新的间隔时间 failure_action: 更新失败的操作:continue、rollbak,pause(默认) monitor:监视更新失败的等待时间 max_failure_ratio: 更新的失败容错率 order:操作策略:stop-first、start-first rollback_config:回滚策略 ...同上...
走向集群
改造目标
一般两个步骤:① 搭建集群 ② 发布服务
P1
搭建Docker Swarm集群
单节点/多节点的初始化方式:参考docker swarm -- help指令;
集群节点的管理:参考docker node --help指令
$ docker swarm --helpUsage: docker swarm COMMANDManage Swarm
Commands: ca Display and rotate the root CA init Initialize a swarm join Join a swarm as a node and/or manager join-token Manage join tokens, 如果忘记Token,可以执行这个参数 leave Leave the swarm unlock Unlock swarm unlock-key Manage the unlock key update Update the swarm
P2
docker stack发布服务
可使用docker service create方式创建服务,
个人偏好定义docker-stack.yml文件发布。
下面在生产部署中追加的production.yml
version: "3.7"
services:
proxy:
networks:
- webnet
receiver:
deploy:
replicas: 1
restart_policy:
condition: on-failure
networks:
- webnet
app:
deploy:
replicas: 2
restart_policy:
condition: on-failure
update_config:
parallelism: 1
delay: 5s
order: stop-first
networks:
- webnet
networks:
webnet:
# docker stack不加载同目录下的.env环境变量文件,原有适用于docker-compose工具的yml文件可采用变通方法
docker stack deploy -c <(docker-compose -f docker-stack.yml -f production.yml config) eqidstack
服务部署效果:注意其中的Ports指的是 服务对外暴露的端口
#docker stack ls:NAME SERVICES ORCHESTRATOReqidstack 3 Swarm
#docker service ls:ID NAME MODE REPLICAS IMAGE PORTS jml6ecfa330r eqidstack_app replicated 2/2 12205500/eqidmanager:master 3381stpkirgj eqidstack_proxy replicated 1/1 nginx:latest *:80->80/tcp, *:8080->8080/tcpvhz4ef8p4ffp eqidstack_receiver replicated 1/1 12205500/eqidreceiver:master
可通过 docker network inspect ingress 验证容器eqidstack_proxy.1连接到ingress网络; docker network inspect eqidstack_webnet 验证有4个容器连接到overlay网络
P+
不停服更新/不停服扩容
手动更新服务:docker service update [opton] {some_service_name}
为{eqidstack_proxy}服务添加 [重启策略]
手动扩容:docker service scale [option] {service=replicas}
将{eqidstack_proxy}服务扩容为2容器
? 可通过docker service inspect eqidstack_proxy验证操作结果
总结
docker service 定义某个(副本集)容器在生产环境下的状态,一般业务含义上的服务相关;
docker stack 定义一组服务,服务间协作、调用,支撑整个业务架构;
docker swarm 管理一组服务在集群节点上的的部署。
+ https://docs.docker.com/get-started/part4/
+ https://docs.docker.com/engine/swarm/how-swarm-mode-works/services/
+ https://docs.docker.com/network/overlay/
+ https://docs.docker.com/engine/swarm/ingress/