目录
一、准备三台虚拟机,并安装docker
二、在三台主机分别开启以下端口:
三、在主节点上执行swarm命令
四、在从节点上执行join命令
五、创建共享网络
1、查看集群节点
2、查看网络信息
六、各个节点离开集群
背景:容器节点部署在不同的主机上,实现高可用
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。
一、准备三台虚拟机,并安装docker
如果不知道怎么安装,可以参考我的这篇文章
Docker镜像、容器和数据管理
另外,如果是新启的虚拟机,不能联通网络的话,可以尝试看看网络配置有没有指定网关。
二、在三台主机分别开启以下端口:
这个不能偷懒,三台都要执行,或者嫌麻烦的话,直接关闭防火墙也行,但是生产环境不建议这样做
firewall-cmd --add-port=2377/tcp --permanent #TCP端口2377用于集群管理通信
firewall-cmd --add-port=7946/tcp --permanent #TCP和UDP端口7946用于节点之间的通信
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent #UDP端口4789用于覆盖网络流量
firewall-cmd --reload #重新载入刷新修改
firewall-cmd --zone=public --list-ports #查看开通的端口
当然liunx也可以使用命令拼接的方式去执行,看这篇文章
shell 多个命令一起执行的几种方法
https://www.cnblogs.com/chenlifan/p/13810640.html
三、在主节点上执行swarm命令
选择一台服务器作为主节点,创建swarm集群
docker swarm init
此时会输出如下结果
[root@localhost etc]# docker swarm init
Swarm initialized: current node (vkkl57cihhvxip10dlh9391pd) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
192.168.1.18:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@localhost etc]#
四、在从节点上执行join命令
在输出结果中,我们可以拿到以worker身份加入集群的命令,只需要把以下命令分别在加入集群的docker容器的服务器里边执行即可
docker swarm join \
--token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
192.168.1.18:2377
注意:执行命令时,docker必须是启动状态。
执行完成后会提示,该节点以工作节点的状态加入集群。
[root@localhost ~]# docker swarm join \
> --token SWMTKN-1-0k2r5mh4ddq63ambeicd40v2opw0pi8yes0tr3bn77cbgwiu2r-ae1fgnl2q2p2pnn6aonl993me \
> 192.168.1.18:2377
This node joined a swarm as a worker.
[root@localhost ~]#
五、创建共享网络
1、查看集群节点
在主节点上输入以下命令
docker node ls
可以看到上边加入节点的两台docker
[root@localhost etc]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
7wqt60k83sf3jixjexfcv2dpu localhost.localdomain Ready Active
cbqjwsb40smyg01qn3914sdap localhost.localdomain Ready Active
vkkl57cihhvxip10dlh9391pd * localhost.localdomain Ready Active Leader
[root@localhost etc]#
注意,只能在主节点上查看,在从节点上会出现以下错误
[root@localhost ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Worker nodes can't be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.
[root@localhost ~]#?
2、查看网络信息
docker network ls
输出结果
[root@localhost etc]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e4c4cb1988ca bridge bridge local
26ca69744e63 docker_gwbridge bridge local
40f1bce14fe3 host host local
g37dv3lqrxd7 ingress overlay swarm
#swarm集群创建出来的共享网络,不是用来给容器与容器之间通信的,是swarm用来管理集群的
91a440523949 none null local
[root@localhost etc]#
因此,如果要实现容器与容器之间通信,我们还需要创建一个共享网络:
在主节点的容器中执行以下命令
docker network create -d overlay --attachable sharednet
- -d:网络驱动类型?
- --attachable:声明当前创建的overlay网络可以被容器加入
- sharednet:自定义的网络名称
测试举例:
每个容器中下载tomcat:7的镜像,并指定共享网络运行
docker run -d --name node1 --net=sharednet tomcat:7
docker run -d --name node2 --net=sharednet tomcat:7
docker run -d --name node3 --net=sharednet tomcat:7
进入任何一个容器,看能不能ping通其中任意两台(可以使用docker容器的名字,也可以使用docker内置ip,如-10.0.0.2),如果能够ping通,说明集群搭建成功:
[root@localhost ~]# docker exec -it node2 /bin/bash
root@38248553fe52:/usr/local/tomcat# ping node1
PING node1 (10.0.0.2) 56(84) bytes of data.
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=1 ttl=64 time=0.349 ms
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=2 ttl=64 time=0.374 ms
64 bytes from node1.sharednet (10.0.0.2): icmp_seq=3 ttl=64 time=0.445 ms
^C
--- node1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 0.349/0.389/0.445/0.043 ms
root@38248553fe52:/usr/local/tomcat# ping node3
PING node3 (10.0.0.4) 56(84) bytes of data.
64 bytes from node3.sharednet (10.0.0.4): icmp_seq=1 ttl=64 time=0.562 ms
64 bytes from node3.sharednet (10.0.0.4): icmp_seq=2 ttl=64 time=2.02 ms
^C
--- node3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 0.562/1.293/2.024/0.731 ms
root@38248553fe52:/usr/local/tomcat#
六、各个节点离开集群
管理节点离开集群前,因该把管理节点降级为工作节点再离开,或者是该集群上还有其他Manager节点
注意:如果只有一个Manager节点,而该Manager节点在还有其他工作节点的情况下离开集群,该集群在没有Manager节点的情况下仍然存活,只有把所有工作节点离群后,原Manager节点所在服务器才能创建新的集群。
# 工作节点离开集群
docker swarm leave
# 管理节点离开集群
docker swarm leave --force #必须使用参数--force,强制离开集群,否则会报错
如果想在一个集群中添加Manager节点,在Manager节点输入以下命令,生成对应的token
docker swarm join-token manager
删除失效节点-docker node rm
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
4nzf0ken1fpaapo9mqyzw0yl5 localhost.localdomain Down Active
k0qkclnoeixja2ctak2c13n2j * localhost.localdomain Ready Active Leader
nb1cf8v8cxnw1h32bos6f6t2x localhost.localdomain Ready Active
[root@localhost ~]# docker node rm 4nzf0ken1fpaapo9mqyzw0yl5
4nzf0ken1fpaapo9mqyzw0yl5
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
k0qkclnoeixja2ctak2c13n2j * localhost.localdomain Ready Active Leader
nb1cf8v8cxnw1h32bos6f6t2x localhost.localdomain Ready Active
[root@localhost ~]#
更多详细内容,请看官方文档
https://docs.docker.com/engine/reference/commandline/swarm_init/
|