常用命令:
# 初始化一个swarm
docker swarm init
# 指定初始化ip地址节点
docker swarm init --advertise-addr 管理端IP地址
# 去除本地之外的所有管理器身份!!!
docker swarm init --force-new-cluster
# 离开swarm
docker swarm leave
# 对swarm集群更新配置
docker swarm update
一、实现效果
创建三主单从,因为遵循raft协议,所以必须搭建三台及三台以上的主节点。因为只有当主节点大于等于2的时候,docker集群才会正常工作。搭建三台是为了模拟有一台服务器宕机的情况。
二、准备工作
四台服务器10.0.0.10、10.0.0.100、10.0.0.101、10.0.0.102。
三个主节点、一个从节点,关闭所有服务器防火墙。
三、实例配置
1、以本机为主节点创建一个新网络docker swarm init --force-new-cluster
也可以用docker swarm init --advertise-addr 10.0.0.10
加入一个工作节点
加入一个管理节点需要先获取命令 docker swarm join-token manager
获取命令后在10.0.0.100、10.0.0.101输入管理节点命令,在10.0.0102输入工作节点命令。
检查节点docker node ls(这条命令只能在管理节点上使用),成功启动三个管理节点和一个工作节点。
2、启动my-nginx服务,并且指定8888端口映射80端口:docker service create -p 8888:80 --name my-nginx nginx
检查服务是否启动:docker service ps my-nginx
或者:docker service ls
此时用docker ps检查my-nginx中的一个nginx容器在四台机器的哪一台机器启动,最终发现是在10.0.0.100(随机的,你的可能不一样)
10.0.0.10
10.0.0.100(运行在此机器)
10.0.0.101
10.0.0.102
3、 接着将my-nginx服务扩容,将原本的一个nginx容器升级到3个nginx容器
docker service update --replicas 3 my-nginx
或者:docker service scale my-nginx=3
再次用docker ps查看容器运行在哪台机器
10.0.0.10
10.0.0.100
10.0.0.101
10.0.0.102(发现只有这台机器没有nginx容器运行)
当然不仅仅可以是3个nginx容器,开启10个也非常轻松,而且系统会自动将10个容器分配到4台机器上,并且当有机器宕机时,系统会将该机器上的服务(也可以叫容器)马上重新分配给仍在工作的机器。根据raft协议,只要还有系统中还有两台管理节点,系统就不会停止运行。
四、遇到的问题
1、当一个管理节点挂掉后,其他两个管理节点并不能正常工作
当一个管理节点挂掉后,其他两个管理节点并不能正常工作,出现报错: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.
管理总共有3个管理,1个工作节点,此时仍然有两个节点在工作,不应该这个问题。
解决方法:重建swarm网络(具体是什么原因也不清楚,可能是旧网络需要删除,各个节点离开集群)或者是我没有按照“必须先是node节点离开集群,然后manager节点才能离开集群”的规定而报错。
docker swarm init --force-new-cluster
重启启动之后就好了,实例正常运行。本人在第二台管理节点输入这条命令后,重新在四台虚拟机上重新配置了一遍swarm,随后正常运行。
离开节点
主节点docker swarm leave --force
工作节点docker swarm leave
2、docker+swarm搭建完成后,网站无法访问
理论上无论哪台机子都是可以访问的,而且不管是四台机器的哪一台都可以,即便是该机器没有运行nginx容器,只要该机器在集群里,就可以访问。(!!!该问题还没有解决,ping得通,有网,防火墙已经关闭,10.0.0.10只能访问到本机的10.0.0.10::8888端口,其他访问不了,宿主机也访问不了四台机器)
五、实例检测
网络搭建完成,访问网站失败。