Docker Swarm,主要包含以下概念
Swarm:计算机集群(cluster)在用Docker连接后的状态。docker swarm
命令可以创建、加入、离开一个集群
Node:计算机节点,也可以认为是一个Docker节点,Node分为两类:Manager和Worker
Stack:一组Service,默认情况下,一个Stack共用一个Network,相互可访问,与其它Stack网络隔绝。docker stack
命令可以方便地操作一个Stack,而不用一个一个地操作Service
Service:一类容器,Service有两种运行模式,一是replicated
,指定一个Service运行容器的数量。二是global
,在所有符合运行条件的Node上,都运行一个这类容器
Task:指运行一个容器的任务,是Swarm执行命令的最小单元
Load balancing:即负载均衡,也包含反向代理。Swarm使用的是Ingress形式的负载均衡,即访问每个节点的某个Published端口,都可自动代理到真正的服务。
services:
some-serivce:
...
deploy:
mode: replicated
replicas: 3
默认情况下,mode
就是replicated
,所以这行可以省略。默认replicas
数目为1,代表这个Service只启动1个容器。这个模式,可以按需启动多个服务,Swarm会自动调节,有时一个Node会启动多个容器。
services:
some-serivce:
...
deploy:
mode: global
placement:
...
所有可部署的Node,都部署一个。通过placement
,可以限定满足条件的Node,而避免在不合适的Node进行部署
#####初始化集群
docker swarm init --listen-addr 192.168.8.88:2377
docker swarm join-token worker
docker node ls
docker network create --driver overlay --attachable=true platform
docker node inspect [nodeName]
sudo docker node update [option] [nodeName]
在Manager节点,可以对任意节点设置标签
docker node update $node_name --label-add main=true
$node_name
就是要设置节点的ID或HOSTNAME。Label是键值对形式,main=true
中的main
就是键、true
就是值。设置了Label以后,在Compose文件中就可以用placement
中的constraints
来对可用节点作出限制
services:
some-serivce:
...
deploy:
placement:
constraints:
- node.labels.main == true
以上配置,让some-service
仅在Label被设置为main=true
的节点,才能使用。
docker stack deploy $stack_name -c docker-compose.yaml -c other.yaml ...
$stack_name
是Stack名称。可以用-c
指定多个docker-compose文件,也可在相同Stack下分批次deploy
多个文件。这些YAML文件的写法,和原先用docker-compose
命令执行的没有本质区别,只是多加了以下独特配置,并且会忽略一些Swarm场景下不支持的配置
需要停止Stack的所有服务时,可以执行以下命令
docker stack rm $stack_name
docker service update --image $image:$tag $service_name
Compose file version 3 reference | Docker Documentation