环境
- 服务器
192.168.200.164 manager
192.168.200.165 node1
192.168.200.166 node2 - docker
version 1.12.0+
准备
三台服务都需安装 docker,建议使用的 docker 版本一致。
部署
1. 初始化 Swarm 集群
- 在 192.168.200.164 服务器执下面命令,执行玩后可以看到,得到一个 token 命令,这个命令用于,其他节点加入 swarm 集群使用。
docker swarm init
docker swarm join --token SWMTKN-1-2hwisw74jk5g0nttsrq85ank1hhr7wgd9z57fg2m0eku73690q-05w3j0k91qgszc31eon8l7vru 192.168.200.164:2377
- 查看集群,可看到当前集群只有 192.168.200.164 一台服务器。
docker node ls
2. 集群加入成员
- 在 192.168.200.165、192.168.200.166 服务器执行下面命令
docker swarm join --token SWMTKN-1-2hwisw74jk5g0nttsrq85ank1hhr7wgd9z57fg2m0eku73690q-05w3j0k91qgszc31eon8l7vru 192.168.200.164:2377
3. 查看集群
- 192.168.200.164 服务器执行下面命令,可以看到当前机器中已有单台节点1台 leader 2 台 workers,此时集群就以搭建完成。
docker node ls
4. 扩展
如果装有 portainer 的同学,可以再 leader 节点,查看 swarm 集群信息,也可以进行一些相关操作。
命令行操作
1. 节点
1.1 删除节点
docker node rm aljoiwud0ge61jypmesquc20e
1.2 增加工作节点
此命令在集群初始化是会反馈得到,此命令在 node 节点执行
docker swarm join --token SWMTKN-1-2hwisw74jk5g0nttsrq85ank1hhr7wgd9z57fg2m0eku73690q-05w3j0k91qgszc31eon8l7vru 192.168.200.164:2377
1.3 查看集群
此命令需在 manager 节点执行
docker node ls
1.4 工作节点升级为管理节点
为了保证管理节点的高可用,可以将工作节点升级为管理节点,在管理节点上运行下面的命令
docker node promote hostname
1.4 管理节点降级为工作节点
docker node demote hostname
1.5 节点退出集群
加上-f就是强制退出
docker swarm leave [-f]
2. 服务
2.1 查看服务
查看当前 Swarm 集群运行的服务
docker service ls
2.2 查看服务详情
docker service ps nginx
2.3 查看服务日志
docker service logs nginx
2.4 删除服务
从 Swarm 集群移除服务
docker service rm nginx
异常及解决方案
- 集群没有数半已经的 manager 在线,出现此错误可能由 manager 降为 worker 时发生。
Error response from daemon: rpc error: code = Unknown desc = The swarm
does not have a leader. It’s possible that too few managers are
online. Make sure more than half of the managers are online.
解决:在 192.168.200.164 服务器,执行此命令,192.168.200.164 会初始化为 manager 在线
docker swarm init --force-new-cluster --advertise-addr 192.168.200.164
Token 相关
swarm join-token :可以查看或更换join token。
docker swarm join-token worker:查看加入woker的命令。
docker swarm join-token manager:查看加入manager的命令
docker swarm join-token --rotate worker:重置woker的Token。
docker swarm join-token -q worker:仅打印Token。