docker swarm练手
swarm就不多说了,官网有介绍
https://docs.docker.com/engine/swarm/
下面是我根据官网的做的一些笔记,供自己以后翻看,大神勿喷
1、创建swarm[root@server ~]# docker swarm init --listen-addr 192.168.1.7:23772、在node上添加worker和manager
[root@node1 ~]# docker swarm join \ --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-8r1zi8eboxgq7xxlovw20hbsx \ 192.168.1.7:2377在高可用环境下,我们得为集群添加至少三个(奇数个manager),MANAGER同样也能执行任务 上面的token只能添加worker节点,现在生成MANAGER的token
[root@server ~] docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-0pzork4xouglxzu1yismyz6uckgb3dlcttec1xbchhu787cj5u-4y1r9wn6c50n4i0915ylbrufz \ 192.168.1.7:2377在其他节点上执行上面输出的命令就可以将节点添加为MANAGER角色,当主不可用时,参与投票,保证集群的高可用 原来是: 将另外两个节点以manager角色添加后: 关于 MANAGER STATUS的解释: 1、空:表示不参与群组管理的工作节点。---工作节点 2、leader:意味着节点是对集群进行所有群体管理和编排决策的主要管理器节点。---领导节点 3、reachable:意味着节点是参与投票的管理节点。 如果领导节点不可用,则该节点有资格被选为新的领导者。---备用领导节点 4、unavailable:意味着节点是无法与其他管理员通信的管理员。 如果管理员节点变得不可用,您应该将一个新的管理员节点加入群集,或者将一个工作节点提升为管理员。 3、创建服务
[root@server ~]# docker service create --replicas 2 --name helloworld alpine ping docker.com4、查看你创建的服务
[root@server ~]# docker service ls ID NAME MODE REPLICAS IMAGE tfsglpoo1gdq helloworld replicated 2/2 alpine:latest5、审查服务
[root@server ~]# docker service inspect --pretty helloworld ID: tfsglpoo1gdqihk1bzetnvzj1 Name: helloworld Service Mode: Replicated Replicas: 2 Placement: UpdateConfig: Parallelism: 1 On failure: pause Max failure ratio: 0 ContainerSpec: Image: alpine:latest@sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 Args: ping docker.com Resources: Endpoint Mode: vip [root@server ~]#6、使用docker service ps <SERVICE-ID>查看服务运行在哪个节点上
[root@server ~]# docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ay4192cdqxvh helloworld.1 alpine:latest server Running Running 8 minutes ago vku5p66pdlbv \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 8 minutes ago "task: non-zero exit (1)" i5qz8vppvn6r \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 8 minutes ago "task: non-zero exit (1)" fcp189dtgl19 \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 9 minutes ago "task: non-zero exit (1)" gipphcz9jqld \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 9 minutes ago "task: non-zero exit (1)" sxsa8x3pe6x0 helloworld.2 alpine:latest server Running Running 9 minutes ago [root@server ~]#7、扩展服务 Scale service
[root@server ~]# docker service scale helloworld=6 helloworld scaled to 6 [root@server ~]# docker service ps helloworld ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ay4192cdqxvh helloworld.1 alpine:latest server Running Running 10 minutes ago vku5p66pdlbv \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 10 minutes ago "task: non-zero exit (1)" i5qz8vppvn6r \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 10 minutes ago "task: non-zero exit (1)" fcp189dtgl19 \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 10 minutes ago "task: non-zero exit (1)" gipphcz9jqld \_ helloworld.1 alpine:latest viroyal-ubuntu Shutdown Failed 11 minutes ago "task: non-zero exit (1)" sxsa8x3pe6x0 helloworld.2 alpine:latest server Running Running 10 minutes ago zwzokl53lj3l helloworld.3 alpine:latest server Running Running 17 seconds ago ip0smw10aaqh helloworld.4 alpine:latest viroyal-ubuntu Running Running 10 seconds ago qn8poyny1k4z helloworld.5 alpine:latest viroyal-ubuntu Running Running 9 seconds ago jw51jivjuu31 helloworld.6 alpine:latest viroyal-ubuntu Running Running 9 seconds ago8、删除service
$docker service rm helloworld
9、滚动升级
$docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6 $docker service update --image redis:3.0.7 redis --update-parallelism标签配置服务中同步升级的任务数量. --update-delay标签配置一个服务任务或一系列任务升级的时延.10、node下线 有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务可用。使用 docker node update --availability drain <NODE-ID>将节点下线,swarm会将当前节点上的容器关闭并在其他节点上启动。 当维护完成,需要上线时,将节点状态修改为active状态即可,命令如下:docker node update --availability active <NODE-ID> 11、在Swarm集群中创建overlay网络
docker network create \ --driver overlay \ --subnet 10.0.9.0/24 \ my-network--subnet命令行参数指定overlay网络使用的子网网段。创建完成后使用docker network ls查看创建的网络: 将服务连接到overlay网络 在创建服务时可以通过--network参数将服务连接到某个网络:
docker service create \ --replicas 3 \ --name my-web \ --network my-network \ nginx docker service inspect \ --format='{{json .Endpoint.VirtualIPs}}' \ my-web加入my-network网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信。 使用swarm模式的服务发现 默认情况下,当创建了一个服务并连接到某个网络后,swarm会为该服务分配一个VIP。此VIP根据服务名映射到DNS。在网络上的容器共享该服务的DNS映射,所以网络上的任意容器可以通过服务名访问服务。 在同一overlay网络中,不用通过端口映射来使某个服务可以被其它服务访问。Swarm内部的负载均衡器自动将请求发送到服务的VIP上,然后分发到所有的active的task上。 下面的实例展示了在同一个网络中添加了一个busybox服务,此服务可以通过名称my-web访问前面创建的nginx服务: 在manager节点上,部署一个busybox服务到与my-web服务相同的网络中,也就是my-network中:
docker service create \ --name my-busybox \ --network my-network \ busybox \ sleep 3000 3rdnz62u2n8d916d5zxbo9laxhttps://andyyoung01.github.io/2016/11/26/%E5%9F%BA%E4%BA%8ESwarm%E7%9A%84%E5%A4%9A%E4%B8%BB%E6%9C%BA%E5%AE%B9%E5%99%A8%E7%BD%91%E7%BB%9C/ 12、检查集群manager和worker的状态 MANAGER节点:
docker node inspect server --format "{{ .ManagerStatus.Reachability }}"worker节点:
docker node inspect server --format "{{ .Status.State }}"我们这台服务器,既是manager,也是worker节点 如果MANAGER节点挂了,我们通过如下操作来恢复: 1、重启docker daemon 2、重启机器 3、如果以上都不行的话 - 将其他的worker节点提升为manager - 清除当前失败的manager节点 docker node demote <NONE> docker node rm <id-node> 一个节点无法使用、无法响应,需要删除的时候,如果docker node rm报错 加上--force即可
docker node rm --force node9
13、备份swarm
数据目录
/var/lib/docker/swarm/
1、如果swarm开启了auto-lock,那么在恢复备份启动集群的时候,你需要秘钥
2、在manager上停止docker,然后备份,虽然可以热备,但是不建议这么做,可能会导致数据的不一致
3、备份/var/lib/docker/swarm/ 文件夹
4、重启manager
14、恢复swarm
1、关闭docker
2、删除/var/lib/docker/swarm下所有的文件
3、将备份的文件还原到此目录下
4、启动docker,并且重新初始化swarm,防止它作为node加入别的集群
Errorresponsefromdaemon:rpcerror:code=4desc=contextdeadlineexceeded
从失去法定人数恢复的最佳方法是将失败的节点重新联机。 如果不能这样做,则从此状态恢复的唯一方法是使用管理器节点的--force-new-cluster操作。 这将除去运行该命令的管理器之外的所有管理器。
实现法定人数是因为现在只有一名经理。 促进节点成为管理员,直到您拥有所需数量的管理员。
docker swarm init --force-new-cluster --advertise-addr node01:2377
16、强制swarm重新负载均衡
当您向群集添加新节点时,或者节点在不可用后重新连接到集群,集群不会自动向空闲节点分配任务。这是设计决定的。如果集群为了平衡而将任务定期地转移到不同的节点,则使用这些任务的客户端将被中断。目的是避免扰乱运行的服务,以便在整个群组中实现平衡。当新任务启动时,或当具有运行任务的节点变得不可用时,这些任务被赋予较不繁忙的节点。目标是最终平衡,最终对最终用户的影响最小。
在Docker 1.13及更高版本中,您可以使用-force或-f标志与docker service update命令强制服务在可用的工作节点之间重新分配其任务。这将导致服务任务重新启动。客户端应用程序可能会中断。如果您已配置,您的服务将使用滚动更新。
优质内容筛选与推荐>>