详细参照官网:https://docs.docker.com/swarm/scheduler/filter/#configure-the-available-filters
(本文涉及的docker版本:v17.12)
filter可以控制swarm对哪些节点进行container的调度。filter 一共分为两类:node filters 和 container configuration filters。分别针对节点和容器进行过滤。
具体的filters如下:
node filters:
constraint:
docker可以参照默认的 tag 以及定制的 labels 来进行调度。默认tag(docker info 获得)包括:
-
-
-
node
(参照nodeID 或者 name)storagedriver
executiondriver
kernelversion
operatingsystem
定制label方式(需要重新启动docker daemon),这里添加两个label:
$ docker daemon --label environment="production" --label storage="ssd"
使用label:比如需要在定制的storage=ssd label的node上运行一个mysql容器
$ docker tcp://<manager_ip:manager_port> run -d -P -e constraint:storage==ssd --name db mysql
-
-
health:
防止容器运行在不健康的节点上,例如down的节点或者是无法“沟通”的节点
containerslots:
限制节点最多运行容器的数量
$ docker daemon --label containerslots=3
这里本节点的容器限制数量为3,若所有节点都达到3,swarm报错。
container configuration filters:
affinity :
对象为容器:可以保证容器运行在同一个网络节点中,并且容器会down当被affinity的容器关闭。使用方式:
$ docker tcp://<manager_ip:manager_port> run -d --name logger -e affinity:container==frontend logger
logger容器affinity frontend容器,当frontend关闭时,logger也会结束
对象为image:容器将只会被调度到含有该image的node上
$ docker tcp://<manager_ip:manager_port> run -d --name redis1 -e affinity:image==redis redis
对象为label: 首先容器运行时添加label:
$ docker tcp://<manager_ip:manager_port> run -d -p 80:80 --label com.example.type=frontend nginx
其次:
$ docker tcp://<manager_ip:manager_port> run -d -e affinity:com.example.type==frontend logger 此时logger就affinity到了nginx容器上。
dependence:
swarm将会把容器调度到依赖容器对应的节点上,若节点无法创建容器(节点不存在或者节点资源不够),则容器不会被创建。依赖一共是下面3种:
-
-
-volumes-from=dependency
(shared volumes)--link=dependency:alias
(links)--net=container:dependency
(shared network stacks)
-
若有多个依赖,则必须同时满足:
--volumes-from=A --net=container:B
此时swarm会寻找容器A和B所在的节点,若AB不在同一个节点,或者节点资源等不满足,则不会创建。
port:
无论是使用bridge模式还是host模式,当宿主机的某个端口在所有的node上都被占用时,容器创建失败。否则swarm选择端口未被占用的node进行调度。