Docker | docker swarm

docker swarm

docker swarmdocker官方编排Orchestration项目之一
Swarm: a Docker-native clustering system

  • 在使用Swarm管理docker集群时,会有一个swarm manager以及若干的swarm nodeswarm 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 调度策略

spreadbinpackrandom

  • spreadswarm会选择一个正在运行的container的数量最少的那个节点来运行container
  • binpackswarm会尽可能的把所有的容器放在一台节点上面运行
  • randomswarm会随机选择一台节点运行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
ConstraintAffinityPortDependencyHealth

# 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。