docker swarm
docker swarm
是docker
官方编排Orchestration
项目之一
Swarm: a Docker-native clustering system
- 在使用
Swarm
管理docker
集群时,会有一个swarm manager
以及若干的swarm node
,swarm manager
上运行swarm daemon
,用户只需要跟swarm manager
通信,然后swarm manager
再根据discovery service
的信息选择一个swarm node
来运行container
-
swarm daemon
只是一个任务调度器(scheduler
)和路由器(router
),它本身不运行容器,它只接受Docker client
发送过来的请求,调度合适的swarm node
来运行container
install docker swarm
docker pull swarm
docker run --rm swarm -v
修改默认配置项, 重启 docker
a. docker -H 0.0.0.0:2375 &
或者
b. vim /etc/default/docker
DOCKER_OPTS="-H 0.0.0.0:2375 -H unix:///var/run/docker.sock"
service docker restart
docker swarm 使用DockerHub提供的服务发现功能
docker run --rm swarm create
# join cluster, token_id=$(docker run --rm swarm create)
docker run -d swarm join --addr=ip_address:2375 token://token_id
# create swarm manage
docker run -d -p 2376:2375 swarm manage token://token_id
# 查询集群状态,任意节点
docker run --rm swarm list token://token_id
docker -H 192.168.1.83:2376 info
docker swarm 使用文件提供的服务发现功能
# 需要加入集群的节点写入cluster文件中
echo 192.168.1.83:2375 >> cluster
echo 192.168.1.84:2375 >> cluster
echo 192.168.1.124:2375 >> cluster
# 在docker swarm manage节点上执行
docker run -d \
-p 2376:2375 \
-v $(pwd)/cluster:/opt/cluster \
swarm manage file:///opt/cluster
docker swarm 调度策略
spread
、binpack
、random
-
spread
:swarm
会选择一个正在运行的container
的数量最少的那个节点来运行container
-
binpack
:swarm
会尽可能的把所有的容器放在一台节点上面运行 -
random
:swarm
会随机选择一台节点运行container
docker run -d \
-p 2376:2375 \
-v $(pwd)/cluster:/opt/cluster \
swarm manage --strategy=spread file:///opt/cluster
docker -H 192.168.1.83:2376 run \
--name node-1 -d -P redis
docker -H 192.168.1.83:2376 run \
--name node-2 -d -P redis
docker -H 192.168.1.83:2376 run \
--name node-3 -d -P redis
docker -H 192.168.1.83:2376 ps # 容器分布在不同节点
docker run -d \
-p 2376:2375 -v $(pwd)/cluster:/opt/cluster \
swarm manage --strategy=binpack file:///opt/cluster
docker -H 192.168.1.83:2376 run \
--name node-1 -d -P redis
docker -H 192.168.1.83:2376 run \
--name node-2 -d -P redis
docker -H 192.168.1.83:2376 run \
--name node-3 -d -P redis
docker -H 192.168.1.83:2376 ps # 容器在同一节点
docker swarm过滤器
swarm
的调度器在选择节点运行容器的时候支持几种过滤器filter
Constraint
,Affinity
,Port
,Dependency
,Health
# Constraint Filter
DOCKER_OPTS="-H 0.0.0.0:2375 \
-H unix:///var/run/docker.sock --label label_name=083"
# 在指定节点上启动容器
docker -H 192.168.1.83:2376 run \
--name redis \
-d -e constraint:label_name==084 redis
# Affinity Filter,可以让一个容器紧挨着另一个容器启动
# 也就是说让两个容器在同一个节点上面启动
docker -H 192.168.1.83:2376 run -d \
--name redis redis
docker -H 192.168.1.83:2376 run -d \
--name redis_backup -e affinity:container==redis redis
docker -H 192.168.1.83:2376 run -d \
--name redis -e affinity:image==redis redis
# Port Filter也会被认为是一个唯一的资源
docker -H 192.168.1.83:2376 run \
-d -p 80:80 nginx