简介
swarm介绍
swarm 包含多个运行在swarm mode下的docker host,这些hoshs包括manager和worker角色。没给你host既可以做为manager,也可以作为worker,或者2者都可以。
当创建一个服务的时候,即定义了一个最佳的状态,包括服务replicas、网络、存储、以及暴露给外面的端口等资源。docker用于维护需要的状态,如果一个节点不可用,docker将调度该节点的任务到其他节点。
节点介绍
节点即为加入swarm集群中的docker实例(docker 节点)。
当实施一个应用到swarm时候,就需要提交一个服务的定义到管理节点(manager node),管理节点就会分配工作单元(task)到对应的工作节点(work node).
工作节点接受并执行来自于管理节点的任务,默认情况下管理节点也作为一个work节点跑对应的服务,但实际中可以配置service不运行在manager上,使manager仅仅充当管理角色。worker节点会定期向manger通知分配的任务状态,以便于manager能维护每个worker需要的状态。
服务和任务
service是需要执行在各个节点上任务的定义。它是swarm系统的核心结构,也是用户和swarm交互的主要方式。当创建1个服务的时候,通常会指定容器镜像和容器内部执行的命令。
一个任务包含了一个docker 容器和y一些跑在容器内部的命令, 它是swarm调度的原子单元。 管理节点根据服务中replicas的规模,将任务分配到各个工作节点。一旦一个任务分配到某个节点,它就不能移动到另外及诶单,除非该任务失败。
负载均衡
管理节点使用ingress load balancing 来暴露服务,从而使外部到swarm为可用状态。在用户没有指定端口的情况下,swarm manager节点默认为服务分配一个PublishedPort,通常在30000-32767 范围内。
Swarm mode 拥有一个内部DNS不见,用于自动地分配每个服务一个DNS实体。基于服务的DNS名称,swarm 管理节点在集群内部服务之间用 internal load balancing 来分发请求。
swarm集群搭建
通过以下3个步骤即可搭建一个swarm集群了,后续可以根据需要增删节点,改变节点角色。
- swarm初始化
$ docker swarm init Swarm initialized: current node (p2phyrhwcp3k155gu24cci89x) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-5ig1j6az5r0wah7bq3qs3q5zv8iaz4kmubvj79rvns807f3vcm-dza07w1gla63weerzmfaq34xb 10.120.75.102:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions
- 添加节点到集群
\# docker swarm join --token SWMTKN-1-5ig1j6az5r0wah7bq3qs3q5zv8iaz4kmubvj79rvns807f3vcm-dza07w1gla63weerzmfaq34xb 10.120.75.102:2377 This node joined a swarm as a worker.
- 提升work节点为manager
查看当前节点状态: $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION p2phyrhwcp3k155gu24cci89x * test01 Ready Active Leader 19.03.8 hwkcculi3kop48g75k88mc110 test02 Ready Active 19.03.11 rr7nl5cd5yecv5nklfsr9bpzg test03 Ready Active 19.03.8 执行docker node demote <node id>将 manager 节点 demote 为 worker 节点 执行docker node promote <node id>将 worker 节点 promote 为 manager 节点 $ docker node promote hwkcculi3kop48g75k88mc110 Node hwkcculi3kop48g75k88mc110 promoted to a manager in the swarm. promte后全部为leader,一般建议至少3个基数节点作为leader
常用命令
- swarm init
swarm 集群初始化,具体命令见 swarm初始化 - swarm join
节点加入集群,在任意一个manager上执行皆可,具体见 添加节点到集群 - service create
新建服务
service_create新建一个服务,名称为reids docker service create --name redis redis:3.0.6 新建一个服务,3个replica,名称为redis3 docker service create --name redis3 --replicas=3 redis:3.0.6
- service inspect
#docker service inspect redis
#docker service inspect redis --pretty
添加–pretty后,以比较友好的方式输出容器信息
- service ls
ls 查看所有服务#docker service ls ID NAME MODE REPLICAS IMAGE PORTS ckipvhtby52z redis replicated 1/1 redis:3.0.6 gmi00f0g7enf redis3 replicated 3/3 redis:3.0.6 #docker service ls -q n只列出IDs
- service rm
删除redis3 服务
#docker service rm redis3 - service scale
将redis服务扩容为2个
#docker service scale redis=2 -d - service ps
列出redis的所有服务, -q参数使之只列出IDs
#docker service ps redis
#docker service ps redis -q - service update
1)限制cpu为2
# docker service update --limit-cpu 2 redis
2)添加8079映射到容器内6379端口
# docker service update --publish-add published=8079,target=6379 redis
service_update