使用docker-compose文件定义应用,使用docker部署Swarm Cluster
注:docker-compose Version3+ 才支持 Swarm 部署( 增加了deploy)
Version3 deploy 部分配置解读
endpoint_mode
为连接到群集的外部客户端指定服务发现方法,有一下两种配置,默认设置为【vip】
- vip:Docker为服务分配了虚拟IP(VIP),该虚拟IP充当客户端访问网络上服务的前端。Docker在客户端与服务的可用工作节点之间路由请求,而客户端却不知道有多少节点正在参与服务或其IP地址或端口。
- dnsrr:DNS轮询(DNSRR)服务发现不使用单个虚拟IP。Docker设置服务的DNS条目,以便对服务名称的DNS查询返回IP地址列表,并且客户端直接连接到其中之一。在需要使用自己的负载平衡器或混合Windows和Linux应用程序的情况下,DNS轮询很有用。
version: "3.7"
services:
web:
image: web
deploy:
endpoint_mode: vip
labels
指定服务标签。这些标签仅在服务上设置,而不在服务的任何容器上设置。使用key,value的形式
version: "3.7"
services:
web:
image: web
deploy:
labels:
com.example.description: "This label will appear on the web service"
要在容器上设置标签,请使用labels之外的键deploy:
version: "3.7"
services:
web:
image: web
labels:
com.example.description: "This label will appear on all containers for the web service"
mode
默认值为replicated
- global:集群里只有一个节点容器,不能通过scale做横向扩展
- replicated:容器的指定数量。可通过docker service scale 做横向扩展
version: "3.7"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: global
placement
设置service的限制条件和首选项的位置
version: "3.7"
services:
db:
image: postgres
deploy:
placement:
constraints:
- node.role == manager // db服务指定部署在manager节点上
- engine.labels.operatingsystem == ubuntu 14.04
preferences:
- spread: node.labels.zone
replicas
如果mode值为replicated,replicas可指定在初始化时给定服务应运行的容器数。
version: "3.7"
services:
worker:
image: dockersamples/examplevotingapp_worker
deploy:
mode: replicated
replicas: 6
resources
配置资源约束
例如如下示例,redis服务被限制为使用不超过50M的内存和0.50(不超过单个内核的50%)可用处理时间(CPU),并且具有保留20M的内存和0.25CPU时间(始终可用)。
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy
服务在退出容器时的配置,例如是否重新启动容器
- condition:重启条件 none,on-failure,any(默认值:any)
- delay:重新启动尝试之间等待的时间(默认值:0)
- max_attempts:尝试重启次数(默认值:无限)
- window:决定重新启动是否成功之前要等待的时间,指定为持续时间(默认值:立即决定)。
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config
配置应如何更新服务。对于配置滚动更新很有用
- parallelism:一次更新的容器数。
- delay:在更新一组容器之间等待的时间。
- failure_action:如果更新失败,该怎么办。其中一个continue,rollback或者pause (默认:pause)。
- monitor:更新每个任务以监视失败后的持续时间(ns|us|ms|s|m|h)(默认为0s)。
- max_failure_ratio:更新期间可以容忍的故障率。
- order:更新期间的操作顺序。其中一个stop-first(旧任务,开始新的一个前停止),或者start-first(新的任务首先启动,并且正在运行的任务简单重叠)(默认stop-first)注:仅支持V3.4及更高版本。
version: "3.7"
services:
vote:
image: dockersamples/examplevotingapp_vote:before
depends_on:
- redis
deploy:
replicas: 4
update_config:
parallelism: 2
delay: 10s
order: stop-first
模板
demo1
version: '3'
services:
web:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: root
networks:
- my-network
depends_on:
- mysql
deploy:
mode: replicated
replicas: 3
endpoint_mode: vip
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
update_config:
parallelism: 1
delay: 10s
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-network
deploy:
mode: global
placement:
constraints:
- node.role == manager
volumes:
mysql-data:
networks:
my-network:
driver: overlay
demo2
version: "3"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints: [node.role == manager]
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- 5000:80
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- 5001:80
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints: [node.role == manager]
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
frontend:
backend:
volumes:
db-data:
docker stack部署swarm集群
支持的命令:
- deploy 部署一个新的stack,或更新stack
docker stack deploy wordpress --compose-file=docker-compose.yml
- ls 列出stacks
docker stack ls
- ps 查看某个任务
docker stack ps wordpress
- service 列出一个stack里的services
docker stack services wordpress
- rm 移除
docker stack rm wordpress