0
点赞
收藏
分享

微信扫一扫

Docker Swarm--搭建Docker集群


搭建Docker集群:

  • ​​一、使用Docker Machine工具配置新服务器上的Docker环境(安装失败了。。。。)​​
  • ​​二、服务器都具备docker环境后,开始配置Docker Swarm​​
  • ​​退出当前docker集群环境​​
  • ​​Docker Swarm 集群配置​​
  • ​​测试Docker Swarm 高可用​​

一、使用Docker Machine工具配置新服务器上的Docker环境(安装失败了。。。。)

如果每台服务器上都已经手动安装了Docker环境,那么可以直接跳过此步骤。刚开始我也是手动在服务器上安装Docker,今天看到​​Docker Machine​​工具之后,打算尝试一下批量安装。

Docker Machine官方介绍:https://docs.docker.com/v1.13/machine/overview/

Docker引擎在Linux系统上本地运行。如果你有一个Linux机器作为你的主系统,并且想要运行docker命令,你所需要做的就是下载并安装docker引擎。但是,如果您想要在网络、云甚至本地上提供多个Docker主机的有效方法,则需要Docker机器。
无论您的主系统是Mac、Windows还是Linux,都可以在其上安装Docker机器,并使用Docker - Machine命令来提供和管理大量Docker主机。它自动创建主机,在主机上安装Docker引擎,然后配置Docker客户端。每个托管主机(“机器”)都是Docker主机和配置客户机的组合。

Docker Machine是一个配置和管理Dockerized主机(主机上有Docker引擎)的工具。通常,在本地系统上安装Docker机器。Docker机器有自己的命令行客户端Docker - Machine和Docker引擎客户端Docker。可以使用Machine在一个或多个虚拟系统上安装Docker引擎。这些虚拟系统可以是本地的(如在Mac或Windows上的VirtualBox中使用Machine安装和运行Docker引擎时),也可以是远程的(如使用Machine在云提供商上提供Dockerized主机时)。Dockerized主机本身可以被认为是托管的“机器”,有时也被称为托管的“机器”。

服务器环境介绍:当前服务器为:

[root@localhost network-scripts]# uname -a
Linux localhost 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

服务器列表:

Master:192.168.3.3 – A

Slave:192.168.3.4 --B

Slave:192.168.3.5 --C

由于我事先已经在A,B两台服务器上安装过Docker环境了,这里使用Docker Machine通过服务器A完成在C上的Docker环境的安装。

首先在A服务器上安装Docker环境,然后才能安装Docker Machine,输入以下命令从docker仓库中下载下来,并完成权限配置,目前最新版是:0.16.0,我这里下载的版本是0.16.0,最新版可见:https://github.com/docker/machine/releases

[root@localhost network-scripts]# curl -L https://github.com/docker/machine/releases/download/v0.16.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&
> chmod +x /tmp/docker-machine &&
> sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

过程会比较慢,十几分钟还没下载完,第一次下载了0.10版本的,结果查看版本​​docker-machine -v​​提示未找到该命令。

[root@localhost network-scripts]# docker-machine -v
bash: docker-machine: command not found...

然后下载0.16版本的,提示一个要小时:

Docker Swarm--搭建Docker集群_Docker


最后37分钟下载完了,然后查看版本,还是提示命令未找到。。。。。

Docker Swarm--搭建Docker集群_Docker Swarm_02

心态崩了,在第二台服务器里面安装仍然不好使,我决定直接安装Docker Swarm

二、服务器都具备docker环境后,开始配置Docker Swarm

  1. 在需要设置为Manager的节点上输入如下命令,开始容器集群搭建,IP地址写现在服务对外IP。

docker swarm init --advertise-addr <MANAGER-IP>

可以获得如下信息,证明docker集群初始化成功了,这时集群中只有一个节点,也是Leader。

Docker Swarm--搭建Docker集群_Docker Swarm_03


–advertise-addr 允许集群中的其他节点访问Swarmkit API和覆盖网络。swarm中的其他节点必须能够访问此地址。

如果docker里面安装的有Portainer,则需要退出后重新登录Portainer后,菜单栏即可显示Swarm信息。

搭建集群:
复制该命令,在其他子节点(服务器)上执行完毕,子节点便是加入了该容器集群(可通过docker-machine ssh xxx的方式快速进入到目的节点中执行)。

在192.168.3.4服务器上运行上面的指令,可见该节点成功加入,并作为一个worker

Docker Swarm--搭建Docker集群_linux_04


对所有节点加入完毕,通过​​docker node ls​​命令查看节点信息,加入的节点和本身节点将会显示出来。这里运行了三台服务器,两台作为work。

Docker Swarm--搭建Docker集群_Docker_05


2. 如果有新的服务器加入了,并且已经安装好了docker enginee需要加入到节点中且忘记了这一条token的值,可以通过在manager上执行该命令​​docker swarm join-token worker​​再次获得这个值。

Docker Swarm--搭建Docker集群_linux_06


至此,整个容器集群就搭建完毕,Manager节点和Worker节点都接入进来了。如果manager上面部署了Portainer,登录之后也可以看到Swarm的信息。

Docker Swarm--搭建Docker集群_java_07


可以看到上图Name列即为机器的hostname(命令行输入​​hostname​​可查看hostname),但是往往这个名称是没有规律的。这里修改机器的名称,关联ip,这样就可以直接在命令行看到此台机器的名称,我这里三台虚拟机的ip分别为:192.168.3.3,192.168.3.4,192.168.3.5,并且3.3机器为Swarm的Leader,于是这里命名为:

Docker Swarm--搭建Docker集群_Docker Swarm_08

修改hostname : hostnamectl set-hostname docker-manager-3-3 (比如要修改为docker-manager-3-3)

修改完重启生效 :reboot

刚开始试了修改host文件和network文件,重启之后却失效了,然后找到hostnamectl,就很强,重启之后立马生效。

至此可以使用ssh连接是否可以正常登录到目标主机,这里直接在manager机器上操作:

ssh root@192.168.3.4

第一次连接时会提示,输入​​yes​​确认连接,输入节点服务器的密码,就可以登录到节点服务器上了。

Docker Swarm--搭建Docker集群_Docker_09


可以看到当前从docker-manager-3-3机器切换到docker-work-3-4上了。这样就可以打开一个连接窗口,操作多台机器了,避免频繁切换服务器窗口了。

对于Swarm模式下,需要开启几个相关的端口,而在系统中,这几个端口是默认打开的:

​TCP Port 2377​​:用于集群间通信,

​TCP 和UDP Port 7946​​:用于节点间通信,

​UDP Port 4789​​:用于Overlay网络方式下通信,这个是在集群模式下的网络通信方式,单机下采用的是Bridge方式。

我这里是在虚拟机里面操作的,直接关闭了防火墙,如果是云服务器,连接失败时,可以检查一下上面的端口是否开放。

那么如果需要将ssh切换回原来的服务器怎么办呢?

可输入​​~​​​ + ​​Ctrl+Z​​​,在ssh连接的过程中,输入​​~​​,正常情况下命令行是不会显示的,在Ctrl+Z之后,才会显示,并且自动切换回原服务器命令窗口。

Docker Swarm--搭建Docker集群_java_10


现在已经退回到了3-3, ssh 远程客户端会话就在 UNIX 后台中运行, 可以输入​​jobs​​查看当前ssh客户端会话。

Docker Swarm--搭建Docker集群_linux_11


使用fg可直接切换到,jobs为1的会话,如果想切换到后面的,可在fg后面加空格和序号,如​​fg 2​​。

Docker Swarm--搭建Docker集群_java_12


命令执行完后,会停留在一个空行上,这时直接Ctrl+C,就可以切换成功。

Docker Swarm--搭建Docker集群_docker_13

退出当前docker集群环境

使用 ​​docker swarm leave​​,如果当前服务器作为集群中的Leaker时,使用上面命令会有异常提示:

Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message

这时直接在命令后面添加​​-- force​

Docker Swarm--搭建Docker集群_docker_14

 

------------------------------------------------------- 2021-11-13--------------分割线------------------------------------------------------------------------------------------

Docker Swarm 集群配置

这次搭建好Docker Swarm 后,也是按照上面的步骤创建好Leader 节点,然后两台子节点加入集群环境,部署nginx服务也正常访问了。但是尝试将manager节点上的docker 关闭后,发现另外两子节点并没有选出来以为作为Leader。这就很懵了,不是说好了任意节点宕机后,其他节点会自动选出来一个作为manager节点的吗?为啥我的不是。。。。。。

上面的子节点是用 ​​docker swarm token-join worker​​拿到的token加入的集群,加入完成后如下图:

Docker Swarm--搭建Docker集群_Docker Swarm_15


只有一个Leader ,其他子节点后面 ​​MANAGER STATUS​​​ 是空的。如果使用 ​​docker swarm token-join manager​​​ 拿到的token加入集群,显示就会不一样了,​​MANAGER STATUS​​​列会显示 ​​Reachable​​:

Docker Swarm--搭建Docker集群_linux_16

Docker Swarm--搭建Docker集群_docker_17

前后对比可以看到,节点​​docker-80​​作为manager节点加入了Docker Swarm。

这时候在 docker-80 和 docker-81 机器上,也可以执行 ​​docker node ls​​ 命令查看节点状况了,不会提示不是manager节点了。这样才是搭建Docker Swarm 高可用的正确姿势。

Docker Swarm--搭建Docker集群_Docker_18


此时Docker Swarm的状态应该是这样:

Docker Swarm--搭建Docker集群_Docker Swarm_19

  • 离开当前Docker Swarm
    执行命令:docker swarm leave
    执行完成后,当前节点就不再属于Docker Swarm 了,Leader 节点上可以看到当前机器是Down的状态

也可以直接从Leader节点上删除节点:​​docker node rm 节点名称​​​ 或者 ​​docker node rm 节点ID​

Docker Swarm--搭建Docker集群_java_20

测试Docker Swarm 高可用

在 Leader节点docker-79 机器上,关闭docker 使用命令 :​​systemctl stop docker​​​ 或者 ​​service docker stop​

Docker Swarm--搭建Docker集群_linux_21


然后在 docker-80 机器上可以看到已经选举出来Leader了,不过状态都是Unknown:

Docker Swarm--搭建Docker集群_linux_22


然后在 docker-81机器上看下:

Docker Swarm--搭建Docker集群_Docker Swarm_23


集群状态正常,服务实例运行正常,显示4/3 后面可以看到仍然是3个实例在运行,其中 ​​docker-79​​​ 上的nginx无法访问, ​​docker-80​​​ 和 ​​docker-81​​​上的nginx正常访问。然后重启 docker-79 机器上的Docker,发现 docker-79 上面的nginx可以访问了,还以为有一个实例切换到 docker-79 上面了,结果​​docker ps​​ 看下 竟然啥也没有????? 就很神奇了

Docker Swarm--搭建Docker集群_java_24


举报

相关推荐

0 条评论